2010-12-22 2 views
5

Ich muss wissen, ob eine MERGE-Anweisung eine INSERT durchgeführt. In meinem Szenario ist die Einfügung entweder 0 oder 1 Zeilen.T-SQL MERGE - herauszufinden, welche Aktion es dauerte

Prüfregeln:

DECLARE @t table (C1 int, C2 int) 
DECLARE @C1 INT, @C2 INT 

set @c1 = 1 
set @c2 = 1 

MERGE  @t as tgt 
USING  (SELECT @C1, @C2) AS src (C1, C2) 
ON   (tgt.C1 = src.C1) 
    WHEN MATCHED AND tgt.C2 != src.C2 THEN 
     UPDATE SET tgt.C2 = src.C2 
    WHEN NOT MATCHED BY TARGET THEN 
     INSERT VALUES (src.C1, src. C2) 
    OUTPUT deleted.*, $action, inserted.*; 

SELECT inserted.* 

Die letzte Zeile nicht kompiliert (keinen Raum, im Gegensatz zu einem Trigger). Ich kann nicht auf @action oder die Ausgabe zugreifen. Eigentlich möchte ich keine Ausgabe-Metadaten.

Wie kann ich das tun?

Antwort

2

Sie können OUTPUT in eine Tabellenvariable ausgeben und dann von dieser abrufen. Versuchen Sie Folgendes:

DECLARE @t table (C1 int, C2 int) 
DECLARE @C1 INT, @C2 INT 
DECLARE @Output TABLE (DeletedC1 INT, DeletedC2 INT, ActionType VARCHAR(20), InsertedC1 INT, InsertedC2 INT) 

set @c1 = 1 
set @c2 = 1 

MERGE  @t as tgt 
USING  (SELECT @C1, @C2) AS src (C1, C2) 
ON   (tgt.C1 = src.C1) 
    WHEN MATCHED AND tgt.C2 != src.C2 THEN 
     UPDATE SET tgt.C2 = src.C2 
    WHEN NOT MATCHED BY TARGET THEN 
     INSERT VALUES (src.C1, src. C2) 
    OUTPUT deleted.*, $action, inserted.* INTO @Output; 

SELECT * FROM @Output WHERE ActionType = 'INSERT' 
1

Ich denke, die einzige Möglichkeit, die eingefügten Zeilen zu erhalten, ist die Verwendung eines AFTER INSERT Triggers auf der Zieltabelle.

Um Ihren MERGE-Einschub von anderen Einsätzen zu unterscheiden, können Sie eine dritte Tabelle verwenden, in die Sie MERGE einfügen. Definieren Sie in dieser Tabelle einen AFTER INSERT-Trigger, um die zusammengeführten Zeilen zu verarbeiten und die Zeilen in die Zieltabelle einzufügen.

+0

+1 Das würde funktionieren. Offensichtlich versuche ich, den ganzen Code in einem gespeicherten Proc zu behalten, aber ich nehme an, dass es keinen Schaden bei der Migration dieses Teils gibt. – IamIC

Verwandte Themen