복붙노트

[SQL] XML 데이터 형식 방법 "값"의 인수 하나는 문자열 리터럴이어야합니다

SQL

XML 데이터 형식 방법 "값"의 인수 하나는 문자열 리터럴이어야합니다

어떻게 이런 오류가 발생하지 않도록 내 T-SQL 쿼리를 변경합니다 :

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. ==============================

    1.당신은 암시 적으로 SQL 변수를 사용해야합니다 :

    당신은 암시 적으로 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. ==============================

    2.당신은 동안 루프를 제거하고 하나는 분쇄기는 XML에 노드를 사용하여 이동에 삽입 할 수 있습니다.

    당신은 동안 루프를 제거하고 하나는 분쇄기는 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
    
  3. from https://stackoverflow.com/questions/10408445/the-argument-1-of-the-xml-data-type-method-value-must-be-a-string-literal by cc-by-sa and MIT license