Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL Server:如何通过SQL变量删除xml节点?_Sql Server_Xml_Tsql - Fatal编程技术网

Sql server SQL Server:如何通过SQL变量删除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实例作为插入的直接

关于堆栈溢出的第一个问题:)

我有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是最后一个使用的选项。谢谢你的回答。最后,我用了动态的方式。谢谢。最后,我用了动态的方式。谢谢