2010-06-16 71 views

回答

2

我不認爲你可以在一個單一的步驟做到這一點 - 但你可以做的兩個步驟,如果你的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

9

我對這個問題已經很晚了,但如果您希望將來「大規模更新」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

0

功能與sql:variable也適用於2005服務器。你只需要把所有的建設納入大括號

修改( '取代的價值(// TAG1 /文())[1] {SQL:變量( 「@的NewValue」)}')