2017-01-06 35 views
1

這是爲什麼這樣工作?SQL Server XML字段 - 使用TSQL變量作爲XML節點序列指示器

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

但是爲什麼這不是工作?其中唯一的差異是[2][sql:variable("@i")]

導致錯誤味精 '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 

文檔結構例子...

<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