2011-11-27 67 views
1

我有兩個(不知何故相關)與XML字段的表。問題是我必須用第二個XML的數據更新第一個XML。超過100條記錄。如何用TSQL做到這一點?TSQL:如何從來自其他表的xml中的值更新xml字段?

我已經創建了這樣的東西。

UPDATE [pwi_new].[dbo].[art] 
SET rest.modify(' 
    replace value of (/root/e[k="alien_id"]/v[1]/text())[1] 
    with sql:column("new.rest.value(
     ''(/root/e[k="alien_id"/v)[1]'',''varchar(max)'') 
    ") 
') 
FROM art_new AS new WHERE 
    (
     art.title = new.title 
     OR art.id = 1352 AND new.id = 119 
     OR art.id = 1353 AND new.id = 120 
     OR art.id = 1379 AND new.id = 146 
     OR art.id = 1380 AND new.id = 147 
    ) 
    AND art.parent = 1460 

但是,它不起作用。我得到這個錯誤

的XQuery [pwi_new.dbo.art.rest.modify()]:

''(/root/e[k="alien_id"/v)[1]'',''varchar(max)'') 
: '' 或 ')' 在此行預計

並且如果可能的話,不知道如何解決。


它看起來不可能沒有子查詢,cte,視圖等。


TSQL: How can I update the value of an xml tag with the value of an xml tag from another related table?
我知道這個問題。我有超過100條記錄,所以我想要一個不需要sql的選項:變量

+0

如何將兩個表相關的?另一篇文章看起來非常接近你所描述的你想要的東西。 –

+0

表格與1到1相關。但是沒有簡單的鍵。不同的是,我有超過100條記錄要更新,而不是一條。 – Michas

+0

「它不起作用」。它會拋出一個錯誤嗎?怎麼了? –

回答

3

讀取您的問題中的鏈接,我使用了這個想法,並修改了您的起始查詢以包含CTE以刪除SQL:變量。

我沒有任何XML數據,現在來測試這一點,但這樣的事情應該工作(語法將接近,不太熟悉的XQuery)

WITH NewXmlData AS 
(
    SELECT art.Id AS artId, new.Id AS newId 
     , new.rest.value('(/root/e[k="alien_id"/v)[1]','VARCHAR(MAX)' AS newValue 
    FROM [pwi_new].[dbo].[art] 
     , art_new AS new 
    WHERE 
    (
     art.title = new.title 
     OR art.id = 1352 AND new.id = 119 
     OR art.id = 1353 AND new.id = 120 
     OR art.id = 1379 AND new.id = 146 
     OR art.id = 1380 AND new.id = 147 
    ) 
     AND art.parent = 1460 
) 
UPDATE art 
SET rest.modify(' 
    replace value of (/root/e[k="alien_id"]/v[1]/text())[1] 
    with sql:column("NewXmlData.newValue") 
    ") 
') 
FROM [pwi_new].[dbo].[art] 
INNER JOIN NewXmlData ON art.Id = NewXmlData.Id 
+0

它看起來很有效...謝謝。 – Michas

+0

沒問題,我們會看看其他人能想出什麼。 –

相關問題