2017-01-06 12 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 

структура Doc например ...

<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 

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

  • Нет связанных вопросов^_^