再帰的な cte を使用すると、探している結果を得ることができます。以下に示すように。しかし、少なくともカーソル/while-loop ではありません;)
declare @tmpConstraint table (ID int , Constraint_Value varchar(256))insert into @tmpConstraint values (1, '(OldVal_1) (OldVal_2)'),(2, '(OldVal_2) (OldVal_1)')宣言 @myXML XMLset @myXML =N' OldVal_1 NewVal_1 OldVal_2 NewVal_2 'declare @xmlData table (oldValue varchar(256), newValue varchar(256))insert into @xmlData select oldValue =Child.value('(old)[1]', 'varchar(50)'), newValue =Child.value('(new)[1]', 'varchar(50)')from @myXML.nodes('/qaUpdates/qaUpdate') as N(Child) コード> プレ>
上記は以下の設定に過ぎません。
; with cte (ID, Constraint_Value, CLevel)as( select c.ID, c.Constraint_Value, 1 from @tmpConstraint c union all select p.ID, cast(replace(p.Constraint_Value, x.oldValue , x.newValue) as varchar(256)), p.CLevel + 1 from cte p join @xmlData x on p.Constraint_Value like '%' + x.oldValue + '%')update cset c.Constraint_Value =t.Constraint_Valuefrom @tmpConstraint cjoin ( select *, rn =row_number() over (CLevel desc による ID 順のパーティション) from cte) t on t.ID =c.ID and rn =1select * from @tmpConstraint
プレ>