2012-04-22 10 views
2

XML列(XMLColumn)とVARCHAR列(ABCColumn)の一時表があります。同じ行の別の列値を使用してSQL Server 2005のXMLノードを更新します。

XMLColumn内の特定のXMLノードの値を、同じ行のABCColumnにある値に置き換えようとしています。私は一時テーブル内のすべての行に対してこれを行う必要があります。これは、各フェッチの置換値を保持するカーソルなしで行うことはできますか?

私は

XmlColumn.modify('replace value of ... with ...') 

を使用して一時テーブルへの更新をやって試してみましたが、私はこのケースで変数を持っていません。私はXYZColumnの値を取得し、それを置換値として使用する必要があります。私が見たすべての例は、同じ行の列の値ではなく、変数またはハードコードされた値を使用します。

また、私はSQL Server 2005を使用しています。誰にもアイデアはありますか?

答えて

3

UPDATE YourTable 
SET  xml_col.modify(
    'replace value of (/root/val/text())[1] with sql:column("val_col")' 
    ) 

(Andromarのおかげで、私は彼の答えを編集し、彼を使用SQLFiddle(これもこれでも動作します))

+0

これはSQL 2005で動作しますか? – Jaden

+0

私はSQL 2005でそれを書いて実行しました。 – RBarryYoung

+0

何らかの理由で、私はsql:column(とその他のバリエーション)が2008年のものだと考えていました。 – Jaden

3

編集:私はRBarryYoungさんの答えに投票しましたが、その代わりに使用してください!

唯一の方法私は考えることができるカーソルである:このような

declare cur_t cursor for (select id, val_col from YourTable) 
declare @id int 
declare @val int 
open cur_t 

fetch cur_t into @id, @val 
while @@fetch_status = 0 
    begin 
    update YourTable 
    set  xml_col.modify(
     'replace value of (/root/val/text())[1] with sql:variable("@val")') 
    where id = @id 
    fetch cur_t into @id, @val 
    end 

close cur_t 
deallocate cur_t 

Example at SQL Fiddle.

+0

これは基本的に私がやったことです私が止めてより良い方法があるかどうか尋ねる前に、 – Jaden

関連する問題