2016-06-20 18 views
0

Ich habe eine dbo.ChangeLog Tabelle, die wir Änderungen in bestimmten Spalten einfügen. Der normale Weg, ich dies tun, ist etwas entlang der Linien von:Verfolgen Änderungen in 2 + Spalten mit OUTPUT-Klausel

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 

Wenn ich aktualisieren müssen FirstName UND LastName zum Beispiel I 2 Update-Anweisungen in der Regel tun, aber ich frage mich, ob es möglich ist, mehrere zu aktualisieren Spalten in der gleichen Update-Anweisung, während auch die Änderungen in die Tabelle dbo.ChangeLog einfügen.

Antwort

0

Wenn Sie die Definition von dbo.ChangeLog ändern können, wird es trivial, aber ich nehme an, dass das nicht wirklich das ist, was Sie wollen.

Ich würde damit umgehen mit einem Tisch variabel und „Entpivotisierung“ die Daten mit CROSS APPLY (aber wahrscheinlich gut funktionieren würde UNPIVOT zu verwenden ...):

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 

Gerade diese letzte Änderung ein INSERT SELECT in . Beachten Sie, dass hierfür eine Zwischentabelle oder eine temporäre Tabelle erforderlich ist, da Sie CROSS APPLY oder UNPIVOT in einer OUTPUT-Klausel nicht verwenden können.

Verwandte Themen