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

前端 未结 2 1355
心在旅途
心在旅途 2020-12-06 10:56

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.\'

相关标签:
2条回答
  • 2020-12-06 11:12

    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
    
    0 讨论(0)
  • 2020-12-06 11:30

    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
    
    0 讨论(0)
提交回复
热议问题