2017-02-14 69 views
2

我试图让我的头轮SQL,XML节点和交叉应用程序,我会认为下面的代码将返回3行数据,而是我只得到一个。我曾经想过使用Cross应用将查询连接回本身会为我解决这个问题。SQL Server -XML节点不返回多个记录

有人能告诉我我做错了什么吗?

在此先感谢

DECLARE @XML AS XML; 

SELECT @XML = ('<Deal deal_id="821"> 
    <Application_owner>me</Application_owner> 
    <Deal_files> 
    <File>file1.doc</File> 
    <File>file2.pdf</File> 
    <File>file3.xcl</File> 
    </Deal_files> 
</Deal> 
') 

select 
    t.n.value('@deal_id', 'int') as [ID], 
    f.n.value('(File)[1]','varchar(50)') as [FILENAME] 
from 
    @XML.nodes('Deal') t(n) 
cross apply 
    t.n.nodes('Deal_files') f(n) 
+0

'tnnodes( 'Deal_files')'只匹配一个元素,所以你只会得到一个SQL行(wh ich将包含3个XML元素/行)。 – RBarryYoung

回答

5

你接近

DECLARE @XML AS XML; 

SELECT @XML = ('<Deal deal_id="821"> 
    <Application_owner>me</Application_owner> 
    <Deal_files> 
    <File>file1.doc</File> 
    <File>file2.pdf</File> 
    <File>file3.xcl</File> 
    </Deal_files> 
</Deal> 
' 
) 

Select 
    ID = t.n.value('@deal_id', 'int'), 
    FileName = f.n.value('(.)[1]','varchar(50)') 
From 
    @XML.nodes('Deal') t(n) 
Cross Apply 
    t.n.nodes('Deal_files/*') f(n) 

返回

ID FileName 
-------------- 
821 file1.doc 
821 file2.pdf 
821 file3.xcl 
+0

嗨,让我有点挑剔:'tnnodes('Deal_files/*')'应该是'tnnodes('Deal_files/File')',以确保不会返回其他节点... +1边 – Shnugo

+0

@Shnugo完美公平且有效的点 –

+0

谢谢你的回答。如果我理解正确,我的错误是命名元素而不是使用“。”。在这种情况下,由于只有一个'Deal_files',它不会返回多行? – Dan