Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.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
如何删除<;i>;通过SQL语句从XML列表中使用特定值标记(Microsoft SQL Server Management Studio)_Sql_Sql Server_Xml_Xquery - Fatal编程技术网

如何删除<;i>;通过SQL语句从XML列表中使用特定值标记(Microsoft SQL Server Management Studio)

如何删除<;i>;通过SQL语句从XML列表中使用特定值标记(Microsoft SQL Server Management Studio),sql,sql-server,xml,xquery,Sql,Sql Server,Xml,Xquery,我有一个简单的XML列表,如下所示: <i>8</i> <i>20</i> <i>24</i> 8 20 24 对于这个例子,我想从这个列表中删除第二个节点 我该怎么做 DECLARE @xml XML; SET @xml = <i>8</i><i>20</i><i>24</i> SELECT @xml.modify('delete <i&

我有一个简单的XML列表,如下所示:

<i>8</i>
<i>20</i>
<i>24</i>
8
20
24
对于这个例子,我想从这个列表中删除第二个节点

我该怎么做

DECLARE @xml XML;

SET @xml = <i>8</i><i>20</i><i>24</i>

SELECT @xml.modify('delete <i>20</i>')
DECLARE@xml;
SET@xml=82024
选择@xml.modify('delete 20')
谢谢大家!

像这样试试看

DECLARE @xml XML;

SET @xml = N'<i>8</i><i>20</i><i>24</i>';

DECLARE @pos INT=2;
SET @xml.modify('delete /i[sql:variable("@pos")][1]');

SELECT @xml;
DECLARE@xml;
SET@xml=N'82024';
声明@pos INT=2;
SET@xml.modify('delete/i[sql:variable(@pos”)][1]”);
选择@xml;

从xml中删除文本值等于20的节点:

DECLARE @xml XML = '<i>8</i><i>20</i><i>24</i>';
SET @xml.modify('delete i[text()="20"]')
select @xml;
DECLARE @xml XML = '<i>8</i><i>20 </i><i>24</i>';
SET @xml.modify('delete i[text()][contains(.,"20")]')
select @xml;
DECLARE@xml='82024';
SET@xml.modify('delete i[text()=“20”]”)
选择@xml;
删除XML中的第二个“i”节点:

DECLARE @xml XML = '<i>8</i><i>20</i><i>24</i>';
SET @xml.modify('delete i[2]')
select @xml;
DECLARE@xml='82024';
SET@xml.modify('delete i[2]”)
选择@xml;
额外好处:从xml中删除文本值为20的节点:

DECLARE @xml XML = '<i>8</i><i>20</i><i>24</i>';
SET @xml.modify('delete i[text()="20"]')
select @xml;
DECLARE @xml XML = '<i>8</i><i>20 </i><i>24</i>';
SET @xml.modify('delete i[text()][contains(.,"20")]')
select @xml;
DECLARE@xml='82024';
SET@xml.modify('delete i[text()][contains(,“20”)]”)
选择@xml;

谢谢大家!SteveD和Shnugo的两个答案Hi Steve,你的解决方案都有一些缺陷:你不应该检查
是否包含
,而是检查是否相等。谓词
[text()][contains(,“20”)]
将首先查看是否存在
text()
,并检查整个内容是否存在“20”。这将触及更深的节点。。。在这两种解决方案中,您都不必要地使用深度搜索(
//i
)。这可能很危险,尤其是在节点名称可能重复的深层结构中
//我将搜索任何
元素…@PhilippWeigel,因为你是新来的(顺便说一句:欢迎!)请允许我一个提示:你说谢谢非常感谢,但如果在(你选择的最好)答案的投票柜台下面勾选接受检查,那就更亲切了。这将1)将此问题标记为已解决2)使追随者更容易找到最佳解决方案3)向回答者支付积分,4)向您支付积分。一旦你自己越过了15点的边界,你会被要求对捐款进行投票。这就是说谢谢的方式。快乐编码@谢谢你的反馈。编辑以反映您的评论。保留“contains”示例以供参考,如果文本包含空格等,这可能很有用。@PhilippWeigel不太。。。您的谓词应该看起来像
delete i[text()=“20”]
而且您的谓词仍然不正确。使用此XML
'8102024'
尝试上一个示例(使用
conatins
的奖励)。现在再试一次,但不要使用
10
。你明白我的意思吗?如果存在
text()
文本,您只是在检查。。。