gpt4 book ai didi

sql-server-2008 - XQuery 如果存在条件插入/替换

转载 作者:行者123 更新时间:2023-12-01 11:59:09 26 4
gpt4 key购买 nike

XQuery 会怎样检查节点是否存在,如果存在则运行替换语句,如果不存在则运行插入语句?

这是我的想法。我想存储用户是否已阅读 XML 中的重要消息。数据如下所示。

<usersettings>
<message haveRead="0" messageId="23" ></message>
<message haveRead="1" messageId="22" ></message>
</usersettings>

基本上这个 XML 告诉我用户已经阅读了一条消息,而另一条消息仍然需要查看/阅读。

我想将我的插入/替换 xquery 合并到一个语句中。这就是我的想法。

UPDATE WebUsers SET UserSettings.modify('

declare default element namespace "http://www.test.com/test";

IF a node exists with the messageId
code to replace node with new update
ELSE
code to insert a new node with the provided variables
')

WHERE Id = @WebUserId

最佳答案

我还没有找到真正令人满意的方法,但其中一种方法可能适合您。我更喜欢第一种技术,但我很生气,因为我没有找到更优雅的方法。

首先确保节点始终存在

DECLARE @messageID int;
SET @messageID=24;

DECLARE @myDoc xml;
SET @myDoc =
'<usersettings>
<message haveRead="0" messageId="23" >msg</message>
<message haveRead="1" messageId="22" >msg</message>
</usersettings>';
SELECT @myDoc;


SET @myDoc.modify('
insert
if (count(//message[@messageId=sql:variable("@messageID")]) = 0)
then <message haveRead="0">new msg</message>
else()
as last into (/usersettings)[1]
');

SELECT @myDoc;

--now do the rest, safe that the node exists

切换

DECLARE @myDoc xml;
SET @myDoc =
'<usersettings>
<message haveRead="0" messageId="23" >msg</message>
<message haveRead="1" messageId="22" >msg</message>
</usersettings>';
SELECT @myDoc;

DECLARE @messageID int;
SET @messageID=23;

IF @myDoc.exist('//message[@messageId=sql:variable("@messageID")]') = 1
BEGIN
SET @myDoc.modify('replace value of (//message[@messageId=sql:variable("@messageID")]/text())[1]
with "test"')
END
ELSE
BEGIN
SET @myDoc.modify('insert <message haveRead="0">new msg</message>
into (/usersettings)[1]')
END

SELECT @myDoc;

关于sql-server-2008 - XQuery 如果存在条件插入/替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3305500/

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