试图用SQL Server获取所有xml节点,我做错了什么?

时间:2013-03-03 11:35:46

标签: sql sql-server xml xquery-sql

我在表格单元格的MyColumn列中有以下xml:

<BSDL xmlns="..." xmlns:i="...">
  <dateTime>2012-12-30T00:00:00Z</dateTime>
  <dateTime>2013-01-07T00:00:00Z</dateTime>
  <dateTime>2013-01-14T00:00:00Z</dateTime>
  <dateTime>2013-01-21T00:00:00Z</dateTime>
  <dateTime>2013-01-29T00:00:00Z</dateTime>
  <dateTime>2013-02-05T00:00:00Z</dateTime>
  <dateTime>2013-02-12T00:00:00Z</dateTime>
  <dateTime>2013-02-19T00:00:00Z</dateTime>
  <dateTime>2013-03-22T00:00:00Z</dateTime>
  <dateTime>2013-03-29T00:00:00Z</dateTime>
  <dateTime>2013-04-19T00:00:00Z</dateTime>
</BSDL>  

我只是想使用:

查询它(获取所有xml节点)
SELECT BSDL.item.value('(dateTime)[1]', 'datetime')
    from [MyTable]
    CROSS APPLY [MyColumn].nodes ('//BSDL') BSDL(item)  

虽然MyColumn中的MyTable与上面的条目数相同,但每行都没有结果。

1 个答案:

答案 0 :(得分:1)

由于只有一个<BSDL>节点 - 您对//BSDL的调用会选择该单个节点,然后item.value('(dateTime)[1]', 'datetime')会返回第一个<dateTime>子节点。

您需要将XQuery更改为(使用您在示例中提到的xmlns=....命名空间):

;WITH XMLNAMESPACES('.....' as ns)
SELECT 
    item.value('.', 'datetime')
from 
    dbo.MyTable
CROSS APPLY 
    MyColumn.nodes ('/ns:BSDL/ns:dateTime') BSDL(item)  

您需要获取<dateTime>下所有<BSDL>个节点的列表 - 然后您将获得全部,并且您可以逐个检查它们。