Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

The argument 1 of the XML data type method "value" must be a string literal

Tags:

sql

tsql

xml

How to change my T-SQL query so that this error doesn't occur:

'The argument 1 of the XML data type method "value" must be a string literal.'

T-SQL code:

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
like image 800
mj-gholami Avatar asked May 02 '12 05:05

mj-gholami


2 Answers

You must use sql variable implicitly:

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
like image 148
ARZ Avatar answered Oct 24 '22 18:10

ARZ


You can remove the while loop and do the insert in one go using nodes to shred the XML.

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

If @j is there to limit the number of rows you want to insert to mytable you can use this instead.

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

If you for some reason really want to use the loop then you can do like this instead.

while @Count <= @j
begin
  insert into mytable([Word])
  select XMLColumn.value('(/word[sql:variable("@Count")]/@Entry)[1]', 'nvarchar(max)')
  from OtherTable
  where ID = 2
like image 36
Mikael Eriksson Avatar answered Oct 24 '22 18:10

Mikael Eriksson