gpt4 book ai didi

sql-server - 如何使用条件/where子句修改xml变量

转载 作者:行者123 更新时间:2023-12-03 17:21:05 25 4
gpt4 key购买 nike

我正在尝试找出有条件地修改xml变量的值的语法。如果这是一个表,那将很容易,因为我仅使用WHERE子句指定要更新的多个节点中的哪个。但是,当我拥有的只是一个变量时,我使用SET命令进行修改,并且不允许使用WHERE子句。

例:

DECLARE @xml xml = '
<Container>
<Collection>
<foo>One</foo>
<bar>true</bar>
<baz>false</baz>
</Collection>
<Collection>
<foo>Two</foo>
<bar>true</bar>
<baz>true</baz>
</Collection>
<Collection>
<foo>Three</foo>
<bar>true</bar>
<baz>true</baz>
</Collection>
</Container>
'

SELECT node.value('(foo/text())[1]', 'varchar(10)') AS Item,
node.value('(bar/text())[1]', 'varchar(10)') AS IsBar,
node.value('(baz/text())[1]', 'varchar(10)') AS IsBaz
FROM @xml.nodes('/*/Collection') t(node)


所以我有两个问题,我似乎无法弄清楚以下语法:

1)我想只修改'two'模式,以使'IsBar'为false,同时不触及其他节点的'IsBar'值。

2)我想在一条语句中将所有“ IsBar”值更新为“ false”。

我找不到(1)的正确魔咒,而(2)如果尝试了明显的魔咒,则会收到一个错误,指出replace最多只能更新一个节点。

对于(1),我已经尝试过了,但是它没有修改任何内容(尽管它没有给我任何错误),所以我显然在我的路径中缺少明显的东西:

SET @xml.modify('replace value of ((/*/Collection)[(foo/text())[1] = "Two"]/bar/text())[0] with "false"')


对于(2),我想要这样的东西,但它只是给出一个错误:

SET @xml.modify('replace value of (/*/Collection/bar/text()) with "false"')

XQuery [modify()]: The target of 'replace' must be at most one node, found 'text *'


我四处搜寻,根本找不到有人试图有条件地更新xml变量(或一次所有节点)。坦率地说,我显然做错了什么,因为我的尝试都没有修改@xml变量值,所以我只需要另一双眼睛就能告诉我我出了什么问题。

最佳答案

这是“ ..真实生活案例...”的答案。我通过添加一些其他元素来修改了输入XML。 XQuery进行了相应的调整。


的SQL


-- DDL and sample data population, start
DECLARE @xml xml = N'<Container>
<city>Miami</city>
<state>FL</state>
<Collection>
<foo>One</foo>
<bar>true</bar>
<baz>false</baz>
</Collection>
<Collection>
<foo>Two</foo>
<bar>true</bar>
<baz>true</baz>
</Collection>
<Collection>
<foo>Three</foo>
<bar>true</bar>
<baz>true</baz>
</Collection>
</Container>';
-- DDL and sample data population, end

-- before
SELECT @xml AS [before];

-- update single element
SET @xml.modify('replace value of (/Container/Collection[upper-case((foo/text())[1]) = "TWO"]/bar/text())[1] with "false"')

-- after
SELECT @xml AS [After];

-- Method #1, via FLWOR expression
-- update all <bar> elements with the false' value
DECLARE @bar VARCHAR(10) = 'false';

SET @xml = @xml.query('<Container>
{
for $x in /Container/*[not(local-name(.)=("Collection"))]
return $x
}
{
for $y in /Container/Collection
return <Collection>
{
for $z in $y/*
return
if (not(local-name($z) = ("bar"))) then $z
else
(
element bar {sql:variable("@bar")}
)
}
</Collection>
}
</Container>');

关于sql-server - 如何使用条件/where子句修改xml变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57965407/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com