16

このエラーが発生しないように T-SQL クエリを変更する方法:

「XML データ型メソッド「値」の引数 1 は、文字列リテラルでなければなりません。」

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
4

2 に答える 2

25

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
于 2012-05-02T06:38:40.473 に答える
5

nodeswhile ループを削除し、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
于 2012-05-02T06:18:47.327 に答える