2011-10-09 12 views
10

LinkEjecutando if @@ rowcount> 0 resetea @@ rowcount a 0. ¿Por qué?

@@ recuento de filas se utiliza para informar el número de filas afectadas por la última seleccionar, insertar, actualizar o borrar declaraciones

declare @row int select 100 if @@rowcount>0 set @[email protected]@rowcount ... 

Lo anterior devolverá 0 porque tan pronto como if @@rowcount>0 se ejecuta se restablece a 0 ya que no devuelve ninguna fila. Así que siempre asignar a la variable primera

¿Por qué declaración if @@rowcount>0 restablecer @@rowcount a: 0? ¿El valor de @@rowcount no se ve afectado solo por las instrucciones select, insert, update y delete?

gracias

Respuesta

11

Se ve afectado por la última declaración. Al igual que esta sentencia SET

Declare @row int 
select 100 union all select 200 union all select 300 
set @row = @@rowcount; 
SELECT @row, @@rowcount 

Si usted lee la actual Microsoft SQL Server Docs on MSDN, da ejemplos de lo que las declaraciones afectan @@ROWCOUNT. Por ejemplo, "tal como" implica otras declaraciones como SI también fijará a cero

Declaraciones como USO, SET <option>, DEALLOCATE CURSOR, teclas de cursor CLOSE, BEGIN TRANSACTION o COMMIT TRANSACTION restablecer el valor a 0. ROWCOUNT

+0

1 - Por lo que yo entiendo, razón por la cual @@ rowcount devolvió 1 y no 0 porque la consulta "SELECT @row, @@ rowcount" afecta a una fila. Pero pensé que el término "número de filas afectadas" se usaba cuando la instrucción sql trataba con filas reales en las tablas de bases de datos, pero su instrucción de selección no accede a ninguna fila, entonces ¿por qué @@ rowcount devuelve 1? – user702769

+0

2 - Espero que esta pregunta tenga algún sentido. Si tuviéramos que puntualizar, ¿@@ rowcount no devuelve el número de filas YA afectadas por la instrucción select? Si es así, entonces "SELECT @row, @@ rowcount" debe devolver 0 para @@ rowcount, ya que la declaración de selección aún no está completa en el momento en que recupera un valor de @@ rowcount, y como tal, ninguna fila se ha visto afectada ¡¿todavía?! – user702769

+1

@ user702769: El @@ rowcount en 'SELECT @row, @@ rowcount' se ve afectado por el' conjunto @row = @@ rowcount; 'encima de él. Un SELECT no puede leer su propio @@ rowcount – gbn

0

Bueno, Me enfrenté a un problema similar al usar sybase, lo que indica que algo podría estar mal con "si".

declare @counter1 int 
declare @counter2 int 

select @counter1 = @@rowcount 
if @@rowcount = 0 return 
select @counter2 = @@rowcount 

la salida es: Counter1 = 3 Counter2 = 0

I esperaría 3 (original) o 1 (debido a Select).

Esto es aún más extraño, porque de http://infocenter.sybase.com/help/index.jsp?topic=/com.sybase.infocenter.dc38151.1540/doc/html/san1278452893271.html

"El recuento de filas es @@no pone a cero por cualquier declaración que no afecta a las filas, como una instrucción IF." el otro lado hay una gran cantidad de confusión cómo funciona realmente (en base a la discusión en Internet)

Al final de mi solución en primera línea asigno @@ recuento de filas de variables y mi lógica se basa en esa variable

+0

Sí, me sorprendió descubrir (por las malas) que en SQL Server @@ rowcount se restablece una declaración "if". –