我有一个表,其中一列是XML列。
表1:
Column1 Column2
1 XML value
例如,在这里我需要找到具有前导空格的属性值。
这是XML列[上表中的第2列],这里BankAccountNumber
标记有前导空格,所以我需要写一个查询来查找表中所有有前导空格的记录,你能帮我吗?
<PaymentMethodDetails>
<EFtDetails>
<routingNumber>5575776567</routingNumber>
<BankAccountNumber>1234 </BankAccountNumber>
</EFtDetails>
</PaymentMethodDetails>
很遗憾,SQL Server不支持starts-with
和ends-with
函数。但我们可以用substring
来解决这个问题
substring(., 1, 1) = " "
要查找尾随空格而不是前导空格,请使用
substring(., string-length(.), 1) = " "
要查找任何以空格开头的BankAccountNumber
节点,可以使用exist
SELECT *
FROM Table1 t1
WHERE t1.Column2.exist('
/PaymentMethodDetails/EFtDetails/BankAccountNumber/text()[substring(., string-length(.), 1) = " "]
') = 1;
要查找以空格开头的任何节点,可以使用//
包含所有子节点
SELECT *
FROM Table1 t1
WHERE t1.Column2.exist('
//*[text()[substring(., string-length(.), 1) = " "]]
') = 1;
要实际将匹配的节点分解为单独的值,可以使用.nodes
和.value
的组合
SELECT
x.nod.value('local-name(.)[1]','nvarchar(max)'),
x.nod.value('text()[1]','nvarchar(max)')
FROM Table1 t1
CROSS APPLY t1.Column2.nodes('
//*[text()[substring(., string-length(.), 1) = " "]]
') x(nod);
db<gt;小提琴