Аргумент 1 метода "значение" типа данных XML должен быть строковым литералом

Как изменить мой запрос T-SQL, чтобы эта ошибка не возникала:

'Аргумент 1 метода "тип данных" типа данных 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

Ответ 1

Вы должны использовать переменную sql неявно:

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

Ответ 2

Вы можете удалить цикл while и сделать вставку за один раз, используя nodes, чтобы уничтожить XML.

insert into mytable([Word])
select N.value('@Entry', 'nvarchar(max)')
from OtherTable
  cross apply XmlColumn.nodes('word') as T(N)
where ID = 2

Если @j существует ограничение количества строк, которые вы хотите вставить на mytable, вы можете использовать это вместо.

insert into mytable([Word])
select ID
from
  (
    select N.value('@Entry', 'nvarchar(max)') as ID, 
           row_number() over(order by T.N) as rn
    from OtherTable
      cross apply XmlColumn.nodes('word') as T(N)
    where ID = 2
  ) T
where rn <= @j

Если вы по какой-то причине действительно хотите использовать цикл, вы можете сделать это вместо этого.

while @Count <= @j
begin
  insert into mytable([Word])
  select XMLColumn.value('(/word[sql:variable("@Count")]/@Entry)[1]', 'nvarchar(max)')
  from OtherTable
  where ID = 2