TSQL:如何使用另一个相关表中的xml标记的值更新xml标记的值?

问题描述:

如何使用另一个相关表中的xml标记的值更新xml标记的值?TSQL:如何使用另一个相关表中的xml标记的值更新xml标记的值?

是这样的:

UPDATE v2 
SET 
[xml].modify ('replace value of (//TAG1/text())[1] 
       with "CAST(v1.[xml].query(''//TAG2'') AS NVARCHAR(MAX))"') 
FROM 
table2 v2, 
table1 v1 
WHERE 
v2.id = v1.id 

我不认为你可以在一个单一的步骤做到这一点 - 但你可以做的两个步骤,如果你的SQL Server 2008上:

DECLARE @NewValue NVARCHAR(50) 

SELECT @NewValue = [xml].value('(//TAG2)[1]', 'NVARCHAR(50)') 
FROM dbo.v1 
WHERE id = 1 

UPDATE dbo.v2 
SET [xml].modify('replace value of (//TAG1/text())[1] with sql:variable("@NewValue")') 
WHERE id = 1 

在您的replace value of XQuery中指定sql:variable的能力是SQL Server 2008中的一项新功能 - 因此,如果您在2005年停滞不前,那么不幸的是,这将无法工作。

+0

有没有办法使它与“sql:variable”一起工作? – halfjust 2010-06-16 18:03:22

+0

@halfjust:是的 - 请参阅我展示的方法。但我没有看到任何方法来做“大规模更新” - 你需要一个**变量**能够使用'sql:variable' - 你不能只有另一个XQuery表达式.... – 2010-06-16 18:32:39

我对这个问题已经很晚了,但如果您希望将来“大规模更新”XML列,并且您在SQL 2005+中,则可以使用CTE来完成此操作:

WITH NewXmlData AS 
(
    SELECT v2.Id AS id 
     , CAST(v1.[xml].query('//TAG2') AS NVARCHAR(MAX)) AS NewValue 
    FROM table2 AS v2 
    INNER JOIN table1 AS v1 ON v2.id = v1.id 
) 
UPDATE v2 
SET [xml].modify ('replace value of (//TAG1/text())[1] 
       with sql:column("NewXmlData.NewValue")') 
FROM table2 AS v2 
INNER JOIN NewXmlData AS nxd ON v2.id = nxd.id 
+0

感谢您的回答即使你迟到了。这完全符合我的需求。 – 2012-05-18 19:04:42

+1

应该是正确答案!谢啦 :) – 2016-02-19 10:27:13

功能与sql:variable也适用于2005服务器。你只需要把所有的建设纳入大括号

修改( '取代的价值(// TAG1 /文())[1] {SQL:变量( “@的NewValue”)}')