¿Cómo puedo obtener el número de registros afectados por un procedimiento almacenado?
-
05-07-2019 - |
Pregunta
Para las sentencias de SQL INSERT
, UPDATE
y DELETE
ejecutadas directamente contra la base de datos, la mayoría de los proveedores de bases de datos devuelven el recuento de filas afectadas. Para los procedimientos almacenados, el número de registros afectados siempre es -1
.
¿Cómo obtenemos la cantidad de registros afectados por un procedimiento almacenado?
Solución
Registre un parámetro de salida para el procedimiento almacenado y establezca el valor basado en @@ ROWCOUNT
si usa SQL Server. Use SQL% ROWCOUNT
si está usando Oracle.
Tenga en cuenta que si tiene múltiples INSERT / UPDATE / DELETE
, necesitará una variable para almacenar el resultado de @@ ROWCOUNT
para cada operación.
Otros consejos
@@ RowCount
le dará el número de registros afectados por una declaración SQL.
El @@ RowCount
solo funciona si lo emite inmediatamente después. Entonces, si está atrapando errores, debe hacerlo en la misma línea. Si lo divide, perderá el que ponga en segundo lugar.
SELECT @NumRowsChanged = @@ROWCOUNT, @ErrorCode = @@ERROR
Si tiene varias declaraciones, tendrá que capturar el número de filas afectadas para cada una y sumarlas.
SELECT @NumRowsChanged = @NumRowsChanged + @@ROWCOUNT, @ErrorCode = @@ERROR
Resulta para mí que SET NOCOUNT ON
se configuró en el script del procedimiento almacenado (de manera predeterminada en SQL Server Management Studio) y SqlCommand.ExecuteNonQuery ();
siempre se devolvió -1.
Acabo de activarlo: SET NOCOUNT OFF
sin necesidad de usar @@ ROWCOUNT
.
Más detalles que se encuentran aquí: SqlCommand.ExecuteNonQuery () devuelve -1 al hacer Insertar / Actualizar / Eliminar
Para Microsoft SQL Server, puede devolver la variable @@ ROWCOUNT
para devolver el número de filas afectadas por la última declaración en el procedimiento almacenado.
ADVERTENCIA: @@ ROWCOUNT
puede devolver datos falsos si la tabla que se está modificando tiene activadores adjuntos a ella!
El @@ ROWCOUNT
devolverá el número de registros afectados por el GATILLO, no la declaración real.