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节点?
没有一般的收据...
只是一些想法:
如果您知道节点的名称
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)