Получение «Аргумент 1 метода типа XML xml« modify »должен быть строковым литералом» при вставке атрибута в xml - PullRequest
7 голосов
/ 13 апреля 2010

Попробуем следующий код. Но получение аргумента 1 метода типа данных xml «modify» должно быть строковым литералом. много искал, но не могу найти решение этой проблемы

SET @Path = '/@ParentNodeName/@NodeName/child::*'
SET @x.modify('insert attribute status {sql:variable("@status")}
               as first into (' + @Path + ')[1]')

Ответы [ 2 ]

11 голосов
/ 13 апреля 2010

Проблема не в переменной sql: со значением, которое вы пытаетесь вставить, а в способе включения XPath в оператор изменения. Вы не можете связать эту команду вместе - вам нужно использовать литерал:

Так что вам нужно использовать:

SET @x.modify('insert attribute status {sql:variable("@status")}
               as first into (/Parent/Node/)[1]')

Тогда все работает просто отлично.

2 голосов
/ 15 августа 2011

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

Предположим, у вас есть такая иерархия

<Root>
     <Elem1/>
         <Parent1/>
              <Separator/>
                  <Child1/>
</Root>

Запрос: -

DECLARE @Root VARCHAR(50)
DECLARE @Entity VARCHAR(50)
DECLARE @ParentNode VARCHAR(50)
DECLARE @Separator VARCHAR(50)
DECLARE @ChildNode VARCHAR(50)


SET @Root = 'Root'
SET @Entity = 'Elem1'
SET @ParentNode = 'Parent1'
SET @Separator = 'separator'
SET @ChildNode = 'Child1'

select Parent.P.value('.', 'varchar(max)') as MyValue, 
T.uniqueId, T.XMLCol
from [XMLTable] as T
cross apply XMLTable.XMLCol.nodes('(/*[local-name()=sql:variable("@Root")]/*[local-name(.)=sql:variable("@Entity")]/*[local-name(.)=sql:variable("@ParentNode")]/*[local-name(.)=sql:variable("@Separator")]/*[local-name(.)=sql:variable("@ChildNode")])[1]')  as Parent(P) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...