XQuery如果存在条件插入/替换

Mat*_*att 3 xquery sql-server-2008

XQuery会检查一个节点是否存在,然后运行一个替换语句,如果没有,那么插入语句是什么?

这就是我的想法.我想存储用户是否已阅读XML中的重要消息.这是数据的样子.

<usersettings>
    <message haveRead="0" messageId="23" ></message>
    <message haveRead="1" messageId="22" ></message>
</usersettings>
Run Code Online (Sandbox Code Playgroud)

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

我想将insert/replace 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
Run Code Online (Sandbox Code Playgroud)

And*_*ett 5

我没有找到一个非常令人满意的方法,但其中一个可能对你有用.我更喜欢第一种技术,但我很生气,我没有找到一种更优雅的方式.

确保节点始终存在

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
Run Code Online (Sandbox Code Playgroud)

交换

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;
Run Code Online (Sandbox Code Playgroud)