8

これら 2 つの置換値を 1 つの update ステートメントと組み合わせる方法はありますか?

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

4

3 に答える 3

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) にキャストしてから通常の REPLACE() を実行するとうまくいくはずです。参照: t-sql で検索/置換を実行できますか?

于 2011-09-07T00:39:48.620 に答える
2

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

于 2011-09-07T00:14:03.237 に答える
1

変更したい値がいくつかある場合は、sqlservercentralで見つけたこのアプローチを使用できます。select ステートメントを使用してデータを複数回操作し、単一の 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
于 2016-07-20T16:50:18.083 に答える