2017-02-14 2 views
2

Я пытаюсь разобраться в SQL, XML-узлах и Cross apply, я бы подумал, что следующий код вернет 3 строки данных, но вместо этого я их получу только. я думал, что использование Cross для присоединения к запросу обратно на себя решит это для меня.Узлы SQL Server -XML, не возвращающие несколько записей

Может ли кто-нибудь сказать мне, что я делаю неправильно?

Заранее спасибо

Dan

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

@ Шнуго Прекрасно справедливая и действительная точка –

+0

Благодарим вас за ответ. если я правильно понимаю, моя ошибка состояла в том, чтобы назвать элемент, а не использовать «.». который в этом случае не возвратил бы несколько строк, потому что был только один «Deal_files»? – Dan

Смежные вопросы