Sql server SQL Server:如何通过SQL变量删除xml节点?
关于堆栈溢出的第一个问题:) 我有XML:Sql server SQL Server:如何通过SQL变量删除xml节点?,sql-server,xml,tsql,Sql Server,Xml,Tsql,关于堆栈溢出的第一个问题:) 我有XML: DECLARE @xml XML = '<root><tag1 /><tag2 /></root>'; 我的问题是: SET @xml.[modify]('delete sql:variable("@path")'); 但是,我得到了一个错误: Msg 9342,16级,状态1,第9行 XQuery[modify()]:仅支持使用sql:column/sql:variable将XML实例作为插入的直接
DECLARE @xml XML = '<root><tag1 /><tag2 /></root>';
我的问题是:
SET @xml.[modify]('delete sql:variable("@path")');
但是,我得到了一个错误:
Msg 9342,16级,状态1,第9行
XQuery[modify()]:仅支持使用sql:column/sql:variable将XML实例作为插入的直接源
因此,我的问题是:如何通过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;
DECLARE@xml='';
声明@nodeToDelete VARCHAR(100)='tag2';
SET@xml.modify('delete(/root/*[local-name()=sql:variable(“@nodeToDelete”))[1]”);
选择@xml;
如果通过FLWOR查询知道节点的名称
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@xml='';
声明@nodeToDelete VARCHAR(100)='tag2';
SET@xml=@xml.query('
{
对于/root/*[local-name()!=sql:variable(“@nodeToDelete”)]
返回$nd
}
');
选择@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);
DECLARE@xpath VARCHAR(100)='/root/tag2';
声明@command VARCHAR(最大值)=
'DECLARE@xml='';
选择@xml;
SET@xml.modify('delete'+@xpath++');
选择@xml';
打印@命令;
EXEC(@command);
没有一般的答案
只是一些想法:
如果您知道节点的名称
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;
DECLARE@xml='';
声明@nodeToDelete VARCHAR(100)='tag2';
SET@xml.modify('delete(/root/*[local-name()=sql:variable(“@nodeToDelete”))[1]”);
选择@xml;
如果通过FLWOR查询知道节点的名称
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@xml='';
声明@nodeToDelete VARCHAR(100)='tag2';
SET@xml=@xml.query('
{
对于/root/*[local-name()!=sql:variable(“@nodeToDelete”)]
返回$nd
}
');
选择@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);
DECLARE@xpath VARCHAR(100)='/root/tag2';
声明@command VARCHAR(最大值)=
'DECLARE@xml='';
选择@xml;
SET@xml.modify('delete'+@xpath++');
选择@xml';
打印@命令;
EXEC(@command);
不能为XPath使用变量,但可以使用各种谓词。请提供更多关于您现实世界需求的信息。。。只需提及:有一种方法是通过动态创建SQL和EXEC()
…描述起来很复杂,只是创建了一个简化的示例。我在这里有更多的要求:一是保持相同的会话。所以,动态sql是最后一个使用的选项。感谢您的回答。您不能为XPath使用变量,但可以使用各种谓词。请提供更多关于您现实世界需求的信息。。。只需提及:有一种方法是通过动态创建SQL和EXEC()
…描述起来很复杂,只是创建了一个简化的示例。我在这里有更多的要求:一是保持相同的会话。所以,动态sql是最后一个使用的选项。谢谢你的回答。最后,我用了动态的方式。谢谢。最后,我用了动态的方式。谢谢