2017-03-16 5 views
1

のは、我々は3つの列があり、単純なテーブルT1を持っているとしましょう:更新XML

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

今、私たちは、単純なデータを作成します。

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

それから私はに3番目の列を変更したいです

<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では動作しません。次のいずれかの

二つの別々のステートメントに変数の代入と使用スプリット:あなたの後ろにいくつかの複雑なロジックを持っていない限り

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

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

直接列の値を使用します変数の値の計算、2番目のオプションは、パフォーマンス上の理由から好まれています - あなたは二度ではなく一度だけテーブルに触れます。また、2つ以上の行を更新する必要がある場合は、それぞれ異なる値を使用することをお勧めします。

+0

私が探していたもの。あなたが言ったように2つの別々のステートメントを使用するには – ThirdMartian

関連する問題