¿Cómo puedo obtener el número de registros afectados por un procedimiento almacenado?

86

Para INSERT, UPDATEy DELETElas 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?

dthrasher
fuente
1
Set No Count también era mi problema. Para probar, ejecute su procedimiento almacenado en Management Studio y vea si obtiene recuentos, si lo hace, asegúrese de tener una variable de salida.
user2624356

Respuestas:

80

Registre un parámetro de salida para el procedimiento almacenado y establezca el valor en función de @@ROWCOUNTsi usa SQL Server. Úselo SQL%ROWCOUNTsi está utilizando Oracle.

Tenga en cuenta que si tiene varios INSERT/UPDATE/DELETE, necesitará una variable para almacenar el resultado de @@ROWCOUNTcada operación.

Ponis dios mio
fuente
46

@@RowCount le dará el número de registros afectados por una instrucción SQL.

El @@RowCountsó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
Raj Más
fuente
33

Resulta para mí que SET NOCOUNT ONse 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 OFFsin necesidad de usarlo @@ROWCOUNT.

Más detalles encontrados aquí: SqlCommand.ExecuteNonQuery () devuelve -1 al hacer Insert / Update / Delete

Amigo Pascalou
fuente
Esto funciona para mi. Mi proceso almacenado es solo una simple declaración de inserción, y parece estar funcionando. ¡Gracias!
Harvey Darvey
¡Gracias! Buen trabajo en la referencia.
Leo Gurdian
8

Para Microsoft SQL Server, puede devolver la @@ROWCOUNTvariable para devolver el número de filas afectadas por la última instrucción en el procedimiento almacenado.

Bob Mc
fuente
-2

ADVERTENCIA: @@ROWCOUNTpuede devolver datos falsos si la tabla que se modifica tiene activadores adjuntos!

El @@ROWCOUNTdevolverá el número de registros afectados por el TRIGGER, ¡no la declaración real!

Michael Kingsford gris
fuente
8
Resulta que esto no es cierto: stackoverflow.com/questions/7005225/…
Tao