テーブルがあり、XML パラメータの値に基づいて varchar フィールドの 1 つを更新したいと考えています。
次の表があります。
ID Constraint_Value
1 (OldVal_1) (OldVal_2)
2 (OldVal_2) (OldVal_1)
Constraint_Value
次の XML を使用してフィールドを更新したいと考えています。
<qaUpdates>
<qaUpdate><old>OldVal_1</old><new>NewVal_1</new></qaUpdate>
<qaUpdate><old>OldVal_2</old><new>NewVal_2</new></qaUpdate>
</qaUpdates>
アップデート後、以下を目指します。
ID Constraint_Value
1 (NewVal_1) (NewVal_2)
2 (NewVal_2) (NewVal_1)
次の SQL は、私の問題を示しています (セットアップなしで SQL Management Studio で実行できます)。
IF OBJECT_ID('tempdb..#tmpConstraint') IS NOT NULL DROP TABLE #tmpConstraint
GO
CREATE TABLE tempdb..#tmpConstraint ( constraint_id INT PRIMARY KEY, constraint_value varchar(256) )
GO
insert into #tmpConstraint
values (1, '(OldVal_1) (OldVal_2)')
insert into #tmpConstraint
values (2, '(OldVal_2) (OldVal_1)')
select * from #tmpConstraint
declare @myXML XML
set @myXML = N'<qaUpdates>
<qaUpdate><old>OldVal_1</old><new>NewVal_1</new></qaUpdate>
<qaUpdate><old>OldVal_2</old><new>NewVal_2</new></qaUpdate>
</qaUpdates>'
update c
set constraint_value = REPLACE(constraint_value, Child.value('(old)[1]', 'varchar(50)'), Child.value('(new)[1]', 'varchar(50)'))
from #tmpConstraint c
cross join @myXML.nodes('/qaUpdates/qaUpdate') as N(Child)
select * from #tmpConstraint
これにより、次の結果が得られます。
(Before)
1 (OldVal_1) (OldVal_2)
2 (OldVal_2) (OldVal_1)
(After)
1 (NewVal_1) (OldVal_2)
2 (OldVal_2) (NewVal_1)
ご覧のとおり、OldVal_1
更新されたばかりです。OldVal_2
同じままです。
xml パラメータで指定されたすべての要素でフィールドを更新するにはどうすればよいですか?