Получение XQuery [modify ()]: атрибуты верхнего уровня не поддерживаются, ошибка при изменении xml - PullRequest
2 голосов
/ 09 апреля 2010
DECLARE @mycur CURSOR
DECLARE @id int
DECLARE @ParentNodeName varchar(max)
DECLARE @NodeName varchar(max)
DECLARE @NodeText varchar(max)

SET @mycur = CURSOR
FOR
SELECT * FROM @temp

OPEN @mycur

FETCH NEXT FROM @mycur INTO @id,@ParentNodeName,@NodeName,@NodeText

WHILE @@FETCH_STATUS = 0
BEGIN
PRINT @id -- sample statements
PRINT  @ParentNodeName
PRINT  @NodeName
        SET @x.modify
        ('
            insert attribute status {sql:variable("@status")}
            as first
            into (/@ParentNodeName/@NodeName/child::*[position()=sql:variable("@status")])[1] 
        ')
FETCH NEXT FROM @mycur INTO  @id,@ParentNodeName,@NodeName,@NodeText
END

DEALLOCATE @mycur

Любая идея, почему я получаю эту ошибку, так как запрос работает нормально, если я вручную вставлю путь

1 Ответ

0 голосов
/ 30 ноября 2010

Проблема с @ParentNodeName и @NodeName; символ @ используется для обозначения переменной в SQL, но он ссылается на атрибут в XML. Метод .modify () пытается вставить строку в корень с цепочкой атрибутов, которая является плохо отформатированным SQL, когда похоже, что вы пытаетесь построить динамический XML-документ. Вам нужно будет создать динамический оператор SQL, который заменит значения @ParentNodeName и @NodeName их значениями из вашей временной таблицы, например:

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

SET @SQL = REPLACE(@SQL, '@ParentNodeName', @ParentNodeName)
SET @SQL = REPLACE(@SQL, '@NodeName', NodeName)

EXEC (@SQL)

тестировалась.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...