【问题标题】:SQL Server: how to delete xml node by sql variable?SQL Server:如何通过 sql 变量删除 xml 节点?
【发布时间】:2017-02-23 09:53:39
【问题描述】:

我关于 Stack Overflow 的第一个问题 :)

我有 XML:

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

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

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

我的查询是:

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

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

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

【问题讨论】:

  • XPath 不能使用变量,但可以使用各种谓词。请提供有关您的真实世界需求的更多信息...顺便提一下:有一种方法可以通过动态创建的SQL和EXEC()...
  • 描述起来很复杂,只是创建了一个简化的例子。我这里有更多的要求:一个是保持相同的会话。因此,动态 sql 是最后使用的选项。谢谢你的回答。

标签: sql-server xml tsql


【解决方案1】:

没有通用的食谱...

只是一些想法:

如果你知道节点的名字

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-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;

动态创建

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);

【讨论】:

  • 最后,我使用了动态方式。谢谢。
猜你喜欢
  • 2020-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-23
  • 1970-01-01
  • 1970-01-01
  • 2019-08-15
  • 2021-11-16
相关资源
最近更新 更多