2010-06-16 22 views

cevap

2

Sana tek bir adımda bunu yapabilirsiniz sanmıyorum - ama 2008, SQL Server iseniz, iki adımda yapabilirsiniz:

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'nizde sql:variable belirtme yeteneği, SQL Server 2008'deki yeni bir özelliktir. Bu nedenle, 2005'te kaldıysanız, bu ne yazık ki işe yaramaz.

+0

"sql: variable" ile çalışmasını sağlamak için herhangi bir yolu var mı? – halfjust

+0

@halfjust: evet - gösterdiğim yönteme bakın. Ama bir "toplu güncelleme" yapmanın bir yolunu görmüyorum - sql: variable 'kullanabilmek için ** değişken **' e ihtiyacınız var - sadece başka bir XQuery ifadesi olamaz ... –

9

Ben oldukça geç bu soruya dilerim ama hiç "kitle güncelleştirme" gelecekte bir XML sütun arıyorsanız ve SQL 2005+ vardır, bunu gerçekleştirmek için bir CTE kullanabilirsiniz:

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

Yanıtladığınız için teşekkürler Geç kalsan bile. Bu ihtiyaçlarım için mükemmel çalıştı. –

+1

Doğru cevap olmalı! Teşekkürler dostum :) –

0

sql:variable ile birlikte özellik de 2005 Server üzerinde çalışır. Sadece parantez içine tüm inşaat koymak gerekir:, değiştirmek

('değerini değiştirmek (// TaG1/metin()) [1] ile {sql: değişken ("@ newvalue")}')

İlgili konular