Para INSERT
, UPDATE
y DELETE
las sentencias SQL 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 es siempre -1
.
¿Cómo obtenemos el número de registros afectados por un procedimiento almacenado?
Respuestas:
Registre un parámetro de salida para el procedimiento almacenado y establezca el valor en función de
@@ROWCOUNT
si usa SQL Server. ÚseloSQL%ROWCOUNT
si está utilizando Oracle.Tenga en cuenta que si tiene varios
INSERT/UPDATE/DELETE
, necesitará una variable para almacenar el resultado de@@ROWCOUNT
cada operación.fuente
@@RowCount
le dará el número de registros afectados por una instrucción SQL.El
@@RowCount
sólo funciona si se emite inmediatamente después. Entonces, si está capturando errores, debe hacerlo en la misma línea. Si lo divide, se perderá el que coloque en segundo lugar.SELECT @NumRowsChanged = @@ROWCOUNT, @ErrorCode = @@ERROR
Si tiene varias declaraciones, deberá capturar la cantidad de filas afectadas para cada una y sumarlas.
SELECT @NumRowsChanged = @NumRowsChanged + @@ROWCOUNT, @ErrorCode = @@ERROR
fuente
Resulta para mí que
SET NOCOUNT ON
se configuró en el script del procedimiento almacenado (de forma predeterminada en SQL Server Management Studio) ySqlCommand.ExecuteNonQuery();
siempre devolvió -1.Simplemente lo activé:
SET NOCOUNT OFF
sin necesidad de usarlo@@ROWCOUNT
.Más detalles encontrados aquí: SqlCommand.ExecuteNonQuery () devuelve -1 al hacer Insert / Update / Delete
fuente
Para Microsoft SQL Server, puede devolver la
@@ROWCOUNT
variable para devolver el número de filas afectadas por la última instrucción en el procedimiento almacenado.fuente
@@NÚMERO DE FILAS
fuente
ADVERTENCIA:
@@ROWCOUNT
puede devolver datos falsos si la tabla que se modifica tiene activadores adjuntos!El
@@ROWCOUNT
devolverá el número de registros afectados por el TRIGGER, ¡no la declaración real!fuente