2011-02-28 14 views
5

Estoy haciendo declaración de fusión en mi procedimiento almacenado. Necesito contar las filas durante las actualizaciones y las inserciones. Si utilizo una variable común para obtener las filas actualizadas (tanto para actualizar como para insertar) cómo puedo diferir, este es el recuento que recibí de la actualización y este es el recuento que obtuve de insert. Por favor, dame una mejor maneraDeclaración de combinación de SQL Server

Respuesta

8

Puedes crear una variable de tabla para mantener el tipo de acción y luego OUTPUT la columna pseudo $action.

Ejemplo

/*Table to use as Merge Target*/ 
DECLARE @A TABLE (
[id] [int] NOT NULL PRIMARY KEY CLUSTERED, 
[C] [varchar](200) NOT NULL) 

/*Insert some initial data to be updated*/ 
INSERT INTO @A 
SELECT 1, 'A' UNION ALL SELECT 2, 'B' 

/*Table to hold actions*/ 
DECLARE @Actions TABLE(act CHAR(6)) 

/*Do the Merge*/ 
    MERGE @A AS target 
    USING (VALUES (1, '@a'),(2, '@b'),(3, 'C'),(4, 'D'),(5, 'E')) AS source (id, C) 
    ON (target.id = source.id) 
     WHEN MATCHED THEN 
     UPDATE SET C = source.C 
    WHEN NOT MATCHED THEN  
     INSERT (id, C) 
     VALUES (source.id, source.C) 
    OUTPUT $action INTO @Actions; 

    /*Check the result*/ 
    SELECT act, COUNT(*) AS Cnt 
    FROM @Actions 
    GROUP BY act 

devoluciones

act Cnt 
------ ----------- 
INSERT 3 
UPDATE 2 
+0

qué datos se pueden almacenar en la columna acto .. Esto es, si quiero saber cuántas filas se inserta, necesito consultar la tabla con algún tipo de restricción bien, ¿para eso necesito saber que wat data puede entrar en la columna cuando se inserta? así como cuando ocurrió la actualización? –

+0

'select @ l_ins_row = COUNT (*) de @action donde act =' insertado '' –

+0

como necesito obtener el recuento de cada operación –

Cuestiones relacionadas