2013-03-03 42 views
1

我有一个表格单元格下面的XML,在列MyColumn:试图使用SQL Server获取所有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) 

它产生任何结果,尽管我的MyColumnMyTable具有与上面相同的条目数量,对于每一行。

回答

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) 

你需要得到<BSDL>下的所有<dateTime>节点列表 - 那么你会得到所有的他们,你可以检查他们一个接一个。

+0

感谢您的帮助,但仍然没有结果..我检查了数据库,表和列的名称,以及内容一百万次..没有什么似乎,但没有错误,没有结果 – 2013-03-03 12:13:57

+0

@OrenA:你是在你的示例中也提到一个'xmlns = .....' - 但是你没有显示** XML名称空间是什么。您还需要尊重该XML名称空间 - 请参阅我的更新回复 – 2013-03-03 13:26:51

+1

确实命名空间是问题所在。非常感谢! – 2013-03-03 14:13:05