【问题标题】:XML Node Update with Where Clause使用 Where 子句更新 XML 节点
【发布时间】:2015-07-19 08:45:19
【问题描述】:

我有一个带有 XML 列的表。下面是 XML 列的示例数据

         <ColItem>
             <Item>
                <Name>ItemA</Name>
                <Price>100</Price>
             </Item>
             <Item>
                <Name>ItemB</Name>
                <Price>200</Price>
             </Item>
             <Item>
                <Name>ItemC</Name>
                <Price>300</Price>
             </Item>
        </ColItem>

我想在节点中用“ItemNewA”更新“ItemA”。应该检查并更新所有具有项目“ItemA”的行。

伪查询

更新表 将 XmlCol.Modify('ItemA') 设置为 'ItemNewA' XMLCol.Has('ItemA')

在 SQL Server 中实现这一目标的实际查询应该是什么。

【问题讨论】:

    标签: sql-server xml


    【解决方案1】:

    您可以使用 SQL Server XML Data Modification Language 更新 XML 列,特别是使用 replace value of 命令。然后对于 where 子句,使用 XML 方法 exist()=1

    UPDATE Tbl 
    SET XmlCol.modify('replace value of (/ColItem/Item/Name/text()[.="ItemA"])[1] with "ItemNewA"')
    WHERE XmlCol.exist('/ColItem/Item/Name/text()[.="ItemA"]')=1
    

    Sqlfiddle Demo

    更新:

    这是在 XPath/XQuery 中使用 SQL 变量的示例:

    DECLARE @old VARCHAR(10) = 'ItemA'
    DECLARE @new VARCHAR(10) = 'ItemNewA'
    
    UPDATE Tbl 
    SET XmlCol.modify('
        replace value of (/ColItem/Item/Name/text()[.=sql:variable("@old")])[1] 
        with sql:variable("@new")
    ')
    WHERE XmlCol.exist('/ColItem/Item/Name/text()[.=sql:variable("@old")]')=1;
    

    Sqlfiddle Demo

    【讨论】:

    • ItemA 和 ItemNewA 来自一个变量。所以当我尝试这个时: UPDATE Tbl SET XmlCol.modify('replace value of (/ColItem/Item/Name/text()[.="' + var1 + '"])[1] with "' + var2 + ' "') WHERE XmlCol.exist('/ColItem/Item/Name/text()[.="' + var1 + '"]')=1;这给出了错误:XML 数据类型方法“exist”的参数 1 必须是字符串文字。
    • 这是否正确 Declare var1 nvarchar(200) = 'ItemA' Declare var2 nvarchar(200) = 'ItemNewA' UPDATE Tbl SET XmlCol.modify('replace value of (/ColItem/Item/Name/ text()[.="{ sql:variable("var1") }"])[1] with "{ sql:variable("var2") }"') WHERE XmlCol.exist('/ColItem/Item/Name /text()[.= "{ sql:variable("var1") }"]')=1;
    • @user2561997 我了解 MSDN 文档中给出的示例使用场景有点不同。查看更新部分,了解如何在此问题上下文中使用sql:variable()
    • 是否可以不区分大小写?我应该在 where 子句变量中使用 lower/upper 吗?
    • @user2561997 这是可能的,但使用不同的方法(不使用exist())。我建议为此发布另一个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-31
    • 2011-06-12
    • 1970-01-01
    相关资源
    最近更新 更多