2017-02-23 7 views
1

Мой первый вопрос на переполнение стека :)SQL Server: как удалить XML-узел по переменной sql?

У меня есть XML:

DECLARE @xml XML = '<root><tag1 /><tag2 /></root>'; 

Мне нужно удалить узел, но путь к узлу является переменной "@path".

DECLARE @path XML = '/root/tag2'; 

Мой запрос:

SET @xml.[modify]('delete sql:variable("@path")'); 

Но, я получаю сообщение об ошибке: Msg 9342, уровень 16, состояние 1, строка 9 XQuery [изменить()]: экземпляр XML только поддерживается как прямой источник вставки с использованием переменной sql: column/sql:.

Так что мой вопрос: Как удалить узел xml по sql-параметру?

+0

Вы не можете использовать переменную для XPath, но вы можете использовать различные предикаты. Пожалуйста, предоставьте более подробную информацию о ваших * реальных потребностях * ... Просто упомянем: есть способ через * динамически созданный SQL * и 'EXEC()' ... – Shnugo

+0

Его комплекс для описания, только что созданного упрощенного примера. У меня есть больше требований здесь: один должен сохранить тот же сеанс. Таким образом, динамический sql - последний вариант использования. Спасибо за Ваш ответ. – Juozas

ответ

1

Там нет общего recipie ...

Просто некоторые идеи:

Если вы знаете имя узла

DECLARE @xml XML = '<root><tag1 /><tag2 /></root>'; 
DECLARE @nodeToDelete VARCHAR(100)='tag2'; 
SET @xml.modify('delete (/root/*[local-name()=sql:variable("@nodeToDelete")])[1]'); 
SELECT @xml; 

Если вы знаете имя узла с FLWOR-запроса

DECLARE @xml XML = '<root><tag1 /><tag2 /></root>'; 
DECLARE @nodeToDelete VARCHAR(100)='tag2'; 
SET @[email protected]('<root> 
        { 
        for $nd in /root/*[local-name()!=sql:variable("@nodeToDelete")] 
         return $nd 
        } 
        </root>'); 
SELECT @xml; 

динамически созданный

DECLARE @xpath VARCHAR(100)='/root/tag2'; 

DECLARE @command VARCHAR(MAX)= 
'DECLARE @xml XML = ''<root><tag1 /><tag2 /></root>''; 
SELECT @xml; 
SET @xml.modify(''delete ' + @xpath + '''); 
SELECT @xml'; 

PRINT @command; 
EXEC(@command); 
+0

Наконец-то я использовал динамический путь. Благодарю. – Juozas