SQL XML Select Value



如何在此返回中选择"值"。

<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 )

最新更新