Метод «значение» типа данных XML должен быть строковым литералом

Как изменить мой запрос, чтобы эта ошибка не происходила:

Метод «значение» типа данных XML должен быть строковым литералом.

Код T-SQL:

Declare @Count Int = 1 
While(@count <= @j) 
Begin 
insert into mytable 
([Word]) 
Select ([XmlColumn].value(N'word['+Cast(@Count as nvarchar(2))+']/@Entry','nvarchar(max)')) 
    from OtherTable WHERE ID=2

person nona dana    schedule 14.06.2012    source источник


Ответы (2)


Вы не можете конкатенировать переменные как строки таким образом для метода значения. Вам нужно использовать sql:variable("@VariableName").

Итак, ваш пример будет примерно таким:

Declare @Count Int = 1 
While(@count <= @j) 
Begin 
insert into mytable 
([Word]) 

Select ([XmlColumn].value(N'/word[sql:variable("@Count")]/@Entry)[1]','nvarchar(max)'))
    from OtherTable WHERE ID=2
person GarethD    schedule 14.06.2012
comment
Не используйте кавычки для имени переменной: sql:variable(@VariableName) -> sql:variable(@VariableName) - person HuRN; 21.12.2015

Думаю, я бы поискал подход к этому, который не требует цикла WHILE. Основная проблема заключается в возврате позиции элемента вместе с узлом, но я нашел обходной путь в последнем ответе на этот пост: http://social.msdn.microsoft.com/Forums/nl/sqlxml/thread/46a7a90d-ebd6-47a9-ac56-c20b72925fb3

Таким образом, альтернативным подходом будет:

insert into mytable ([Word]) 
select word from (
    Select 
        words.value('@entry','nvarchar(max)') as word,
        words.value('1+count(for $a in . return $a/../*[. << $a])', 'int') as Pos   
    from
        OtherTable ot
        cross apply ot.XMLColumn.nodes('words/word') x(words)
) sub where Pos <= @j

В основном внутренний запрос возвращает каждое слово и его позицию, это может быть отфильтровано внешним запросом.

Для справки, мое определение таблицы OtherWords было следующим:

create table OtherTable (XMLColumn xml)
insert OtherTable (XMLColumn)
select '<words><word entry="Wibble"/><word entry="Hello"/><word entry="World"/></words>'
person Jon Egerton    schedule 14.06.2012