SQL Server:如何通过sql变量删除xml节点?

Juo*_*zas 1 xml t-sql sql-server

我对堆栈溢出的第一个问题:)

我有XML:

DECLARE @xml XML = '<root><tag1 /><tag2 /></root>';
Run Code Online (Sandbox Code Playgroud)

我需要删除节点,但是,节点的路径是变量“ @path”。

DECLARE @path XML = '/root/tag2';
Run Code Online (Sandbox Code Playgroud)

我的查询是:

SET @xml.[modify]('delete sql:variable("@path")');
Run Code Online (Sandbox Code Playgroud)

但是,我得到了错误: 消息9342,级别16,状态1,行9 XQuery [modify()]:仅支持将XML实例用作使用sql:column / sql:variable的插入的直接源。

所以我的问题是:如何通过sql参数删除xml节点?

Shn*_*ugo 5

没有一般的收据...

只是一些想法:

如果您知道节点的名称

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;
Run Code Online (Sandbox Code Playgroud)

如果使用FLWOR-query知道节点的名称

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

动态创建

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);
Run Code Online (Sandbox Code Playgroud)