表名: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/