테이블이 있으며 XML 매개 변수의 값을 기반으로 varchar 필드 중 하나를 업데이트하려고합니다.XML 매개 변수를 기반으로 테이블을 업데이트하는 방법
나는 다음과 같은 테이블이 있습니다
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 Manag에서 실행할 수있는) 그냥 OldVal_1
가 업데이트되었습니다 볼 수 있듯이
(Before)
1 (OldVal_1) (OldVal_2)
2 (OldVal_2) (OldVal_1)
(After)
1 (NewVal_1) (OldVal_2)
2 (OldVal_2) (NewVal_1)
: 장담 스튜디오 어떤 설정하지 않고는) :
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
이 결과를 제공합니다. OldVal_2
은 그대로 유지됩니다.
xml 매개 변수에 지정된 모든 요소로 필드를 업데이트하려면 어떻게해야합니까?
좋은 답변, @mouters. cte를 사용하는 것은 매우 영리한 해결책입니다. 감사. –
기꺼이 도와 드릴 수는 없겠지만 –
이것은 훌륭한 솔루션입니다.하지만 실제로 CTE에 숨겨진 루프입니다. 또한 CTE는 원본 테이블보다 더 많은 행을 가질 수 있습니다 (n 개의 일치하는 값을 가진 각 행에 대해 1 + n + n (n-1) + n (n-1) 2) + ... n! 또한 기본 OPTION (MAXRECURSION n) 값은 100입니다. 그러나 행마다 일치하는 항목이 거의없는 적당한 크기의 테이블의 경우에는 마음에 들었습니다. – GilM