SQL XML选择值

时间:2017-07-31 14:48:52

标签: sql xml

如何选择'值'在这个回报中。

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

但我没有回报。

3 个答案:

答案 0 :(得分:2)

您可以为命名空间定义别名,然后在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找到两个值。

答案 1 :(得分:0)

尝试以下

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 )

答案 2 :(得分:0)

此问题是您的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 )