2011-12-20 12 views
17

Tengo un procedimiento almacenado que borra ciertos registros. Necesito obtener la cantidad de registros eliminados.¿Cómo puedo obtener el número de registros eliminados?

Traté de hacerlo de esta manera:

DELETE FROM OperationsV1.dbo.Files WHERE FileID = @FileID 
SELECT @@ROWCOUNT AS DELETED;    

Pero suprimirse aparece como 0, aunque los registros correspondientes se eliminan. Intenté SET NOCOUNT OFF; sin éxito. ¿Podrias ayudarme por favor? Gracias.

+1

¿Qué se hace con el valor que se obtiene de '@@ ROWCOUNT'? ¿Quieres devolverlo? Es posible que necesite usar 'DECLARE @DeleteCnt INT; SELECCIONE @DeleteCnt = @@ ROWCOUNT' para capturar el valor en una variable que luego puede devolver o insertar en una tabla de auditoría o algo –

Respuesta

24

Eso debería funcionar bien. La configuración de NOCOUNT es irrelevante.

¿Tiene alguna declaración entre los dos que haya mostrado? @@ROWCOUNT se restablece después de cada declaración, por lo que debe recuperar el valor inmediatamente sin declaraciones intermedias.

+0

No, no hay nada en medio. –

+0

¿Cómo lo estás probando? En Management Studio? –

+5

Lo siento, fue mi error. Puse SELECT @@ ROWCOUNT COMO ELIMINADO; después de una instrucción Delete incorrecta. –

-5
START TRANSACTION; 
SELECT @before:=(SELECT count(*) FROM OperationsV1.dbo.Files); 
DELETE FROM OperationsV1.dbo.Files WHERE FileID = @FileID; 
SELECT @after:=(SELECT count(*) FROM OperationsV1.dbo.Files); 
COMMIT; 
SELECT @[email protected] AS DELETED; 

no sé sobre el servidor SQL, pero en MySQL SELECT count(*) FROM ... es una operación extremadamente barato.

+0

Gracias Eugen. Veamos si alguien puede explicar por qué @@ ROWCOUNT no funciona para mí. Usaré tu solución si nadie ayuda con @@ ROWCOUNT. –

+2

En el nivel de aislamiento de transacción predeterminado, esto aún permitiría otra eliminación para cambiar el conteo hasta la mitad de esta consulta. – Andomar

+7

@David - No use esto. Esto es costoso y tiene condiciones de carrera. –

1

utilizo este fragmento de código en la depuración de procedimientos almacenados para verificar los recuentos después de operaciones, tales como un borrado:

DELCARE @Msg varchar(30) 
... 
SELECT @Msg = CAST(@@ROWCOUNT AS VARCHAR(10)) + ' rows affected' 
RAISERROR (@Msg, 0, 1) WITH NOWAIT 
Cuestiones relacionadas