2017-01-06 9 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](これは位置です)、確かに! - 結果が1つしかない(または全くない)しかし、エンジンでは、式が1つの結果になることを予測できません。

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 
関連する問題