2013-05-21 1 views
0

결과가 모든 element 인스턴스를 반환하지 않는 .value 방법의 경로를 이동할 때 내가 SQL 서버 2012XML을 분쇄 .Value 싱글

Xml 열을 쿼리입니다!

,c.value('(*/*/Visitors/Visitor/@Name)[1]', 'NVARCHAR(50)') AS Visitor 
,c.value('(*/*/Senders/Sender/@Name)[1]', 'NVARCHAR(50)') As Sender 

내가 원래 nodes 방법을 사용했지만, Wildcard가 나는 (아래)하지만, 같은과 올바른 결과를 얻을 수 있습니다 알고 이제 성능

CROSS APPLY c.nodes('*') dd(d) 
OUTER APPLY d.nodes(Visitors/Visitor) As ee(e) 
OUTER APPLY d.nodes('Senders/Sender') ff(f) 

을 죽이고 반환하는 방법이 3 개의 싱글 톤을 선언하지 않고 .value 메서드의 경로를 사용하여 모든 요소 결과를 얻거나 복수 요소 인스턴스를 반환하는 유일한 방법은 .nodes입니다.

감사합니다.

,c.value('(*/*/Visitors/Visitor/@Name)[1]', 'NVARCHAR(50)') AS Visitor 
,c.value('(*/*/Visitors/Visitor/@Name)[2]', 'NVARCHAR(50)') AS Visitor2 
,c.value('(*/*/Visitors/Visitor/@Name)[3]', 'NVARCHAR(50)') AS Visitor3  
,c.value('(*/*/Senders/Sender/@Name)[1]', 'NVARCHAR(50)') As Sender 
,c.value('(*/*/Senders/Sender/@Name)[2]', 'NVARCHAR(50)') As Sender2  
,c.value('(*/*/Senders/Sender/@Name)[3]', 'NVARCHAR(50)') As Sender3 
+1

'.value()'는 ** 단일 값 ** 만 반환합니다 ** - 노드 목록을 열거해야하는 경우'.nodes()'를 사용하십시오 - 그것이 그곳에 있습니다! 그러나 제발 -'.nodes (*)'를 사용하지 마십시오. 단지 코딩이 잘못되었습니다 ... –

+0

그래, .nodes()에서 꺼 냈습니다. 다시 내 질문에 대답, 질문에 귀하의 의견을 이동! – KeyboardFriendly

답변

2

.value()에 대한 호출은 정의에 따라 단일 값을 반환합니다.

노드 목록을 열거해야하는 경우 .nodes()을 사용하십시오. 이것이 바로 그 이유입니다.

그러나 .nodes(*)를 사용하여 피하십시오 - 그 성능을 단지 살인자 - 당신이 .nodes() 전화에서의 XPath와 같은 특정 할 필요가

1

당신은 당신이 XML 형식의 노드에서 원하는 요소를 선택할 수 있습니다

declare @x as xml = 
    '<notes>' + 
    '<note>' + 
     '<to>ToP1</to>' +  
     '<Msg>Some Msg</Msg>' + 
    '</note>' + 
    '<note>' + 
     '<to>ToP2</to>' + 
    '<Msg>Some Msg</Msg>' + 
    '</note>' + 
    '</notes>'; 

select Col1.value('(./to)[1]', 'char(10)') from @x.nodes('/notes/note') as x(Col1)