Sql server 在SQL Server 2012中读取XML

Sql server 在SQL Server 2012中读取XML,sql-server,xml,sql-server-2008,tsql,sql-server-2012,Sql Server,Xml,Sql Server 2008,Tsql,Sql Server 2012,我需要使用以下代码读取节点的值: DECLARE @XML AS XML SET @XML =' <ListChk > <IdChk>26</IdChk> <IdChk>29</IdChk> <IdChk>35</IdChk> <obs>test</obs> <Fol>10944</Fol> </ListCh

我需要使用以下代码读取节点
的值:

DECLARE @XML AS XML
    SET @XML ='
<ListChk >
      <IdChk>26</IdChk>
      <IdChk>29</IdChk>
      <IdChk>35</IdChk>
  <obs>test</obs>
  <Fol>10944</Fol>
</ListChk>'

SELECT Y.V.value('IdChk[1]','int') AS chk   
FROM @XML.nodes('/ListChk') X(V)
CROSS APPLY X.V.nodes('IdChk') Y(V)
将@XML声明为XML
SET@XML=
26
29
35
测试
10944
'
选择Y.V.value('IdChk[1],'int')作为chk
来自@XML.nodes('/ListChk')X(V)
交叉应用X.V.nodes('IdChk')Y(V)
但此查询返回的值为null

有什么问题吗?

您的XQuery已经选择了
节点-您不需要(也不能)使用
.value('IdChk[1],'int')
来尝试获取该值

相反,您只需读取这些节点的值,如下所示:

SELECT 
    Y.V.value('.', 'int') AS chk   
FROM 
    @XML.nodes('/ListChk') X(V)
CROSS APPLY 
    X.V.nodes('IdChk') Y(V)
您的XQuery已经选择了
节点-您不需要(也不能)使用
.value('IdChk[1],'int')
尝试获取该值

相反,您只需读取这些节点的值,如下所示:

SELECT 
    Y.V.value('.', 'int') AS chk   
FROM 
    @XML.nodes('/ListChk') X(V)
CROSS APPLY 
    X.V.nodes('IdChk') Y(V)

除非您在根元素上实际使用了某些内容,否则您可以像这样缩短查询

SELECT Y.V.value('.','int') AS chk   
FROM @XML.nodes('/ListChk/IdChk') Y(V)
。。。(即使这样,您也可以使用xpath导航到具有
.value

SELECT 
    Y.V.value('.','int') AS chk 
    ,Y.V.value('../obs[1]','varchar(4)') AS obs
    ,Y.V.value('../Fol[1]','int') AS Fol
FROM @XML.nodes('/ListChk/IdChk') Y(V)

chk obs     Fol
26  test    10944
29  test    10944
35  test    10944

除非您在根元素上实际使用了某些内容,否则您可以像这样缩短查询

SELECT Y.V.value('.','int') AS chk   
FROM @XML.nodes('/ListChk/IdChk') Y(V)
…(即使这样,您也可以使用xpath导航到具有
.value

SELECT 
    Y.V.value('.','int') AS chk 
    ,Y.V.value('../obs[1]','varchar(4)') AS obs
    ,Y.V.value('../Fol[1]','int') AS Fol
FROM @XML.nodes('/ListChk/IdChk') Y(V)

chk obs     Fol
26  test    10944
29  test    10944
35  test    10944

感谢您抽出时间回答我的问题!感谢您抽出时间回答我的问题!