2017-03-16 94 views
1

比方說,我們有三列簡單的表T1:更新XML在SQL Server中的變量

CREATE TABLE T1(C1 INT PRIMARY KEY, C2 VARCHAR(20), C3 XML) 

現在我們創建一個簡單的數據:

INSERT INTO T1 VALUES(1, 'Test', '<Element></Element>') 

然後我想修改第三列實現這樣的事情:

<Element>Test</Element> 

這意味着,C2插入到XML中。

,所以我想這樣做與變量:

DECLARE @test VARCHAR(20) = 'Example' 
UPDATE 
    T1 
SET 
    @test = C2, 
    C3.modify(' 
    replace value of 
    (/Element/text())[1] 
    with sql:variable("@test") ') 

不幸的是,結果是:

<Element>Example</Element> 

我做錯了嗎?

+0

看起來您正在更新並同時設置您的變量,因此更新使用原始值(執行update時執行的值)。 – HoneyBadger

回答

2

您正在修改使用相同語句的底層變量;這在SQL Server中不起作用。或者:

拆分可變分配和使用情況分爲兩個獨立的語句:

DECLARE @test VARCHAR(20); 

select @test = t.C2 
from T1 t; 

UPDATE t SET C3.modify(' 
    replace value of (/Element/text())[1] with sql:variable("@test") 
    ') 
from T1 t; 

OR

直接使用該列的值:

UPDATE t SET C3.modify(' 
    replace value of (/Element/text())[1] with sql:column("t.C2") 
    ') 
from T1 t; 

除非你有背後的一些複雜的邏輯變量值計算,第二個選項由於性能原因是首選 - 您僅觸摸表格一次,而不是兩次。另外,如果您需要更新多於一行的行,並且每行都有不同的值,則強烈建議使用第二個變體。

+0

那就是我在找的東西。你能告訴我怎麼能像你說的那樣使用兩個單獨的陳述? – ThirdMartian