2016-06-20 4 views
0

dbo.ChangeLog 테이블에 특정 열의 변경 사항을 삽입했습니다. 내가 이렇게 정상적인 방법의 라인을 따라 뭔가 :OUTPUT 절을 사용하여 2+ 열의 변경 내용을 추적하십시오.

UPDATE dbo.Table 
SET FirstName = NewFirstName 
OUTPUT 
Deleted.Id 
'FirstName' as Type 
Deleted.FirstName as OldValue 
Inserted.FirstName as NewValue 
INTO dbo.ChangeLog 
FROM dbo.Table as t 
INNER JOIN dbo.Table2 as t2 on t.Id = t2.Id 

나는, 나는 보통 2 업데이트 문을 예를 들어 FirstNameLastName를 업데이트해야하지만 여러 업데이트 할 수 있는지 궁금하고 변경 사항을 dbo.ChangeLog 테이블에 삽입하면서 동일한 갱신 명령.

답변

0

dbo.ChangeLog의 정의를 변경할 수 있다면 사소한 것이지만, 나는 그것이 당신이 원하는 것이 아니라고 생각하고 있습니다.

나는 (...하지만 아마 좋은 너무 UNPIVOT를 사용하여 작동합니다) 테이블 변수를 사용하여이 문제를 해결할 것입니다 및 "UNPIVOT"CROSS APPLY를 사용하여 데이터를 :

SELECT 1 as id, 'Dan      ' as FirstName, 'Field        ' as LastName INTO #tbl 

DECLARE @changes TABLE (id int, old1 varchar(250), new1 varchar(250), old2 varchar(250), new2 varchar(250)) 

UPDATE #tbl 
SET FirstName = 'asdf', LastName = NEWID() 
OUTPUT deleted.id 
     ,deleted.FirstName, inserted.FirstName 
     ,deleted.LastName, inserted.LastName 
    INTO @changes(id, old1, new1, old2, new2) 

-- change this to an INSERT dbo.ChangeLog 
SELECT unp.* 
FROM @changes 
CROSS APPLY (VALUES (id, old1, new1) 
        ,(id, old2, new2)) unp(id, oldval, newval) 


DROP TABLE #tbl 

그냥 마지막을 변경할 수는 INSERT에 SELECT . OUTPUT 절에 CROSS APPLY 또는 UNPIVOT을 사용할 수 없으므로 중간 테이블 변수 또는 임시 테이블이 필요합니다.

관련 문제