У меня есть таблица, и я хочу обновить одно из своих полей varchar на основе значений в XML-параметре.Как обновить таблицу на основе XML-параметра
У меня есть следующая таблица:
ID Constraint_Value
1 (OldVal_1) (OldVal_2)
2 (OldVal_2) (OldVal_1)
, и я хочу использовать следующий XML для обновления Constraint_Value
поля:
<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 Manag Студия без ление любой настройки):
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?
Отличный ответ, @mouters. Использование cte's - очень умное решение. Благодарю. –
без рада я мог бы помочь –
Это приятное решение, но это действительно петля, скрытая в CTE. Также имейте в виду, что CTE может содержать в себе гораздо больше строк, чем исходная таблица (для каждой строки с n соответствующими значениями вы получите 1 + n + n (n-1) + n (n-1) (n- 2) + ... n! Строк). Также имейте в виду, что значение OPTION по умолчанию (MAXRECURSION n) равно 100. Но для таблиц умеренного размера с несколькими совпадениями в строке мне это нравится. – GilM