2010-12-22 20 views
5

Necesito saber si una instrucción MERGE realizó un INSERT. En mi caso, la inserción es 0 o 1 filas.T-SQL MERGE: descubriendo qué acción tomó

Código de ensayo:

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.* 

La última línea no se compila (sin alcance, a diferencia de un disparador). No puedo acceder a @action ni a la salida. En realidad, no quiero ningún metadato de salida.

¿Cómo puedo hacer esto?

Respuesta

2

Puede SALIR en una variable de tabla y luego recuperar de eso. Pruebe esto:

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

Creo que la única forma de obtener las filas insertadas es usar un disparador AFTER INSERT en la tabla de destino.

Para distinguir su inserción de MERGE de otras inserciones puede usar una tercera tabla donde inserte con MERGE. Defina en esa tabla un disparador AFTER INSERT para procesar las filas fusionadas e insertar las filas en su tabla de destino.

+0

+1 Eso funcionaría. Obviamente, estoy tratando de mantener todo el código en un solo proceso almacenado, pero supongo que no hay daño al migrar esa parte. – IamIC