2017-01-06 8 views
1

왜 작동합니까? SQL Server XML 필드 - TSQL 변수를 XML 노드 순서 표시기로 사용

SELECT 
    XDocument 
    .value('(/Book/Chapter[@verse="allo"])[2]', 
     nvarchar(max)') 
FROM XBiblos 
WHERE Version = 666 

그러나 왜이 작동하지 않는 이유는 무엇입니까? 유일한 DIFF가 [2] 오류 MSG 'value()' requires a singleton (or empty sequence), found operand of type 'xdt:untypedAtomic *'

DECLARE @i int; 
SET @i = 2; 

SELECT 
    XDocument 
    .value('(/Book/Chapter[@verse="allo"])[sql:variable("@i")]', 
     nvarchar(max)') 
FROM XBiblos 
WHERE Version = 666 

문서 구조 예제에 [sql:variable("@i")]

...

<XDocument name="DraXQueLah"> 
    <Book name="Worldymort"> 
    <Chapter verse="Forgot">Forgot so loved the world</Chapter > 
    <Chapter verse="Icecream">That we were eternally creamed</Chapter > 
    <Chapter verse="blah">blah blah</Chapter >  
    <Chapter verse="blah">blah blah</Chapter >  
    <Chapter verse="blah">blah blah</Chapter >  
    <Chapter verse="blah blah">blah blah blah</Chapter >  
    </Book> 
</XDocument> 
+0

jd가 sql : variable() 함수의 사용 방법입니다. https://msdn.microsoft.com/en-us/library/ms188254.aspx를 읽으십시오. –

답변

1

로 대체한다는 것입니다 경우 바로 적용 할 수 [1]를 추가 싱글 톤. 엔진은 알고있다, 그 [2] (그것은 위치 다), 할 것이다 - 확실한! - 단 하나 (또는 ​​없음)의 결과 만 가져야합니다. 그러나 엔진이 예측할 수없는 표현식은 하나의 결과가됩니다.

DECLARE @i int; 
SET @i = 2; 

SELECT 
    XDocument 
    .value('(/Book/Chapter[@verse="allo"])[sql:variable("@i")][1]', --<--Here 
     nvarchar(max)') 
FROM XBiblos 
WHERE Version = 666