sql-server - 如何使用 MSSQL 更新多个 XML 字段?

标签 sql-server xml sql-server-2008

表名:TBL_CLIENTS 表字段:XMLDATA

<REPORT xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" DESCRIPTION="TestClient" FILENUM="1234">
  <!--<REPORT DESCRIPTION="TestClient" FILENUM="1234">-->
  <TRACKING>
    <FIRSTNAME>Bobby</FIRSTNAME>
    <LASTNAME>Butcher</LASTNAME>
  </TRACKING>
</REPORT>

我想同时更改 FIRSTNAME 和 LASTNAME。反正我可以在一个查询中完成吗?我能弄清楚的唯一方法是使用两个查询。

UPDATE TBL_CLIENTS
SET [XMLDATA].modify('replace value of (/REPORT/TRACKING/FIRSTNAME/text())  [1] with ("Franny")')
WHERE ORDERID = 5

UPDATE TBL_CLIENTS
SET [XMLDATA].modify('replace value of (/REPORT/TRACKING/LASTNAME/text())[1]  with ("Farmer")')
WHERE ORDERID = 5

最佳答案

这是不可能的 - 根据 MSDN ,替换必须在 XML 节点的单个实例上工作 - 但您可以避免以这种方式在表上执行两个 UPDATE:

DECLARE @doc xml = '<REPORT xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" DESCRIPTION="TestClient" FILENUM="1234">
  <!--<REPORT DESCRIPTION="TestClient" FILENUM="1234">-->
  <TRACKING>
    <FIRSTNAME>Bobby</FIRSTNAME>
    <LASTNAME>Butcher</LASTNAME>
  </TRACKING>
</REPORT>';

DECLARE @t table (xmldata xml);

insert @t (xmldata) values (@doc);

-- grab the XML data from the table for manipulation...
DECLARE @xmlData xml;
SELECT @xmlData = xmldata FROM @t;

set @xmlData.modify('replace value of (/REPORT/TRACKING/FIRSTNAME/text())  [1] with ("Franny")')                   
set @xmlData.modify('replace value of (/REPORT/TRACKING/LASTNAME/text())   [1] with ("Farmer")')

-- now we only need to do one update on the table itself.
UPDATE @t 
SET [XMLDATA] = @xmlData

SELECT * FROM @t;

我知道这不完全是您的要求,但它应该会导致更少的锁定时间和更好的表性能 - 如果这是您的目标。

关于sql-server - 如何使用 MSSQL 更新多个 XML 字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30717122/

相关文章:

mysql - 定期从远程sqlserver拉取数据到本地mysql

java - 有没有办法找出以二进制数据形式存储在数据库中的图像的扩展名?

sql-server - 数据库索引 : Only selects!

java - 将 MarkupBuilder 与 Groovy 结合使用...创建 XML 参数时出现问题

sql - 基于 TSQL/Microsoft SQL Server 中的另一个字段对字段值进行透视

sql-server - 删除并重新创建 SQL Server 临时表上的主键

c# - 如何在xml中写入CData

java - com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException : Unrecognized field "user_activity"

sql - 值连续 n 分钟超过阈值

sql-server-2008 - 将数据插入 View (SQL Server)