如何在此返回中选择"值"。
<int xmlns="http://schemas.microsoft.com/2003/10/Serialization/">247734</int>
我试过了
DECLARE @XML XML
SET @XML = '<int xmlns="http://schemas.microsoft.com/2003/10/Serialization/">247734</int>'
SELECT @XML.value('(/int)[1]', 'varchar(30)')
FROM @xml.nodes('/int') Tbl ( Col )
但我不返回任何值。
您可以为命名空间定义别名,然后在 xpath 中使用该别名。
如果不指定命名空间,xpath 将仅查找没有命名空间的标记。
或者,您可以在 xpath 中查找任何命名空间*:
例如:
DECLARE @XML XML = N'<xml>
<int xmlns="http://schemas.microsoft.com/2003/10/Serialization/">247734</int>
<int>123</int>
</xml>';
-- method 1
;WITH XMLNAMESPACES('http://schemas.microsoft.com/2003/10/Serialization/' AS s)
SELECT Col.value('.', 'int') as Col
FROM @XML.nodes('//s:int') Tbl (Col);
-- method 2
SELECT Col.value('.', 'int') as Col
FROM @XML.nodes('//*:int') Tbl (Col);
请注意,方法 1 仅查找第一个值,而方法 2 同时查找这两个值。
尝试关注
DECLARE @XML XML
SET @XML = '<int xmlns="http://schemas.microsoft.com/2003/10/Serialization/">247734</int>'
SELECT Col.value('(.)[1]', 'int')
FROM @xml.nodes('//*') As Tbl (Col )
此问题是您的 XML 位于定义的命名空间中,并且您尝试使用"默认命名空间"进行选择。
要解决此问题,您应该在选择中定义命名空间:
DECLARE @XML XML
SET @XML = '<int xmlns="http://schemas.microsoft.com/2003/10/Serialization/">247734</int>'
SELECT @XML.value('declare namespace ns="http://schemas.microsoft.com/2003/10/Serialization/"; (/ns:int)[1]', 'varchar(30)' )
FROM @xml.nodes('/') Tbl ( Col )