如何删除<;i>;通过SQL语句从XML列表中使用特定值标记(Microsoft SQL Server Management Studio)
我有一个简单的XML列表,如下所示:如何删除<;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&
<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()
文本,您只是在检查。。。