2011-09-06 6 views
7

これらの2つの置換値を1つの更新ステートメントに組み合わせる方法はありますか?TSQL 2005、XML DML - 一度に2つの値を更新しますか?

UPDATE dbo.MyTable 
SET MyXmlColumn.modify('replace value of (/node/@att1)[1] with "1"') 
WHERE id = 1 

UPDATE dbo.MyTable 
SET MyXmlColumn.modify('replace value of (/node/@att2)[1] with "2"') 
WHERE id = 1 

http://msdn.microsoft.com/en-US/library/ms190675(v=SQL.90).aspx

+0

http://stackoverflow.com/questions/7395942/updating-multiple-xml-nodes-using-t-sqlへの回答をご覧ください。 –

答えて

6

私はあなたが運にいるとは思わない、Thx。

私は喜びのないいくつかの構文上の変種を試しました。

SET MyXmlColumn.modify('...'), MyXmlColumn.modify('...') 

利回り::、明らかたとえば

列名 'MyXmlColumn' 一度SET 句に以上指定されています。列に同じ SET句内に複数の値を割り当てることはできません。 SET句を変更して、列が に1回だけ更新されていることを確認します。 SET節がビューの列を更新する場合、 列名 'MyXmlColumn'がビュー 定義内に2回表示されることがあります。

しかし、このエラーメッセージはXML DML空間では役に立ちません。

最終行はExpression1 & Expression2は単一要素でなければなりません。

も、最も徹底的な議論が

http://blogs.msdn.com/b/denisruc/archive/2005/09/19/471562.aspx

申し訳ありませんが...それをループ終わります。 :(

PS:あなたはVARCHAR(MAX)にキャストし、hackinessを立つことができる場合は、トリックを行う必要があります)(REPLACE通常のをやって参照してください。Can I do a find/replace in t-sql?

2

いいえ、ドキュメントに記載されているように、replace value ofしか一度に単一のノードで動作することができます。私が知る限り、これには回避策はありません。 2つの更新ステートメントを使用する必要があります。

+1

"更新されるターゲットは、式の最後に" [1] "を追加することによって、パス式に明示的に指定された最大でも1つのノードでなければなりません。 これは、私のxpathが1ノードだけを返すことができることを意味するものであり、2つのステートメントがそれぞれ1つのノード – TrevDev

1

をあなたはちょうどあなたがしたい値のカップルを持っている場合変更するにはsqlservercentralにあるこのアプローチを使用することができます。selectステートメントを使用してデータを複数回操作し、1つのupdateステートメントを使用してテーブルデータを変更します。

完璧ではありませんが、いくつかのユースケース。基本的には、固定数の値を変更するためのループソリューションの簡略版です。

DECLARE @temp XML 
SET @temp = (SELECT Column_name FROM Table_name WHERE AuthId = @AuthId) 

SET @temp.modify('replace value of (/UmAuthDto/Assignment/QueueId/text())[1] with sql:variable("@NewValue")') 
SET @temp.modify('replace value of (/UmAuthDto/Assignment/QueueName/text())[1] with sql:variable("@NewValue")') 

UPDATE Table_name 
SET Column_name = @temp 
WHERE AuthId = @AuthId 
関連する問題