2009-07-29 10 views
75

Para INSERT, UPDATE y DELETE sentencias SQL ejecutadas directamente en la base de datos, la mayoría de los proveedores de bases de datos devuelven el recuento de filas afectadas. Para los procedimientos almacenados, la cantidad de registros afectados siempre es -1.¿Cómo puedo obtener el número de registros afectados por un procedimiento almacenado?

¿Cómo obtenemos la cantidad de registros afectados por un procedimiento almacenado?

+1

Set No se cuenta era mi problema también. Para probar, ejecute su procedimiento almacenado en el estudio de administración y vea si obtiene recuentos, si lo hace, entonces asegúrese de tener una varible de salida. – user2624356

Respuesta

74

Registra un parámetro de salida para el procedimiento almacenado, y establezca el valor en función de @@ROWCOUNT si se utiliza 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.

8

Para Microsoft SQL Server que puede devolver la variable @@ ROWCOUNT para devolver el número de filas afectadas por la última sentencia en el procedimiento almacenado.

41

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

Los @@RowCount funciona sólo si se emite inmediatamente después. Entonces, si está atrapando errores, debe hacerlo en la misma línea. Si lo divides, te perderás el segundo que elijas.

SELECT @NumRowsChanged = @@ROWCOUNT, @ErrorCode = @@ERROR 

Si tiene varias cuentas, que tendrá que capturar el número de filas afectadas por cada uno y sumarlos.

SELECT @NumRowsChanged = @NumRowsChanged + @@ROWCOUNT, @ErrorCode = @@ERROR 
-1

ADVERTENCIA: @@ROWCOUNT puede volver datos falsos si la tabla que se modifica ha disparadores unido a él!

El @@ROWCOUNT devolverá el número de registros afectados por el gatillo, no la declaración real!

+8

Resulta que esto no es cierto: http://stackoverflow.com/questions/7005225/sql-server-does-trigger-affects-rowcount – Tao

25

Resultó que SET NOCOUNT ON se configuró en el script de procedimiento almacenado (de forma predeterminada en SQL Server Management Studio) y SqlCommand.ExecuteNonQuery(); siempre devolvió -1.

Acabo de configurarlo: SET NOCOUNT OFF sin necesidad de usar @@ROWCOUNT.

Más detalles se encuentran aquí: SqlCommand.ExecuteNonQuery() returns -1 when doing Insert/Update/Delete

+0

Esto funciona para mí. Mi proceso almacenado es simplemente un simple insertar instrucciones, y parece estar funcionando. ¡Gracias! –

+0

¡Gracias! Buen trabajo en la referencia. –

Cuestiones relacionadas