2012-08-06 37 views
27

¿Cuál es el alcance de @@rowcount? MSDN no menciona su alcance.Alcance de @@ rowcount?

Devuelve el número de filas afectadas por la última instrucción.

Ok.

En mi SP - Estoy insertando en una tabla, que tiene un insert trigger que hace otra inserción cuando se inserta un nuevo valor en la tabla.

Pregunta:

A lo que el alcance @@rowcount se referirá? (disparador o SP)?

Respuesta

20

De acuerdo, el artículo es para SQL Server 2000, pero uno esperaría que el alcance no cambie entre versiones. De acuerdo con el artículo How triggers affect ROWCOUNT and IDENTITY in SQL Server 2000, @@ROWCOUNT no se verá afectado por los desencadenantes.

Específicamente:

Es seguro usar @@ ROWCOUNT en SQL Server 2000, incluso cuando hay un gatillo de la tabla base. El disparador no sesgará tus resultados; obtendrás lo que esperas @@ ROWCOUNT funciona correctamente incluso cuando NOCOUNT está configurado.

Así que si se actualiza tres filas, y las actualizaciones de disparo cinco filas en otro lugar, obtendrá un @@ROWCOUNT de 3.

también, de la respuesta de GBN en SQL Server - is using @@ROWCOUNT safe in multithreaded applications?:

@@ ROWCOUNT es tanto alcance como conexión segura.

De hecho, solo lee el último recuento de filas de sentencias para esa conexión y alcance.

+0

¡Gracias por esta explicación! –

11

estado de cuenta cada insertar/actualizar/Seleccionar/ajustar/eliminar restablece el @@rowcount a las filas afectadas por la sentencia ejecutada

begin 
declare @myrowcount int, 
    @myrowcount2 int 
insert stmt 
SET @[email protected]@rowcount 
if @myrowcount>0 
begin 
insert stmt 
SET @myrowcount2 [email protected]@rowcount 
if @myrowcount2 >0 
do smthg 
end 
end 

o probar esto

SELECT * FROM master.sys.objects -- 50 rows 
    IF (1=1) 
     SELECT @@ROWCOUNT AS RowsAffected -- 0, because the IF did not affect any rows 

incluso una instrucción IF afecta it ... de ahí que su alcance sea el último enunciado leído.