2011-10-09 15 views
10

LinkL'esecuzione se @@ rowcount> 0 ripristina @@ rowcount su 0. Perché?

@@ conteggio delle righe viene utilizzato per informare il numero di righe interessate per l'ultima di selezione, inserimento, aggiornamento o DELETE

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

È possibile che questo restituirà 0 perché non appena if @@rowcount>0 viene eseguito viene reimpostato su 0 poiché non restituisce alcuna riga. Quindi, sempre assegnare alla variabile prima

Perché dichiarazione if @@rowcount>0 reimpostato @@rowcount-0? Il valore di @@rowcount non è influenzato solo da select, insert, update e delete statements?

grazie

risposta

11

È interessato dall'ultima istruzione. Ti piace questa istruzione SET

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

Se leggete il actual Microsoft SQL Server Docs on MSDN, dà esempi di ciò che le dichiarazioni influenzano @@ROWCOUNT. Per esempio "come" implica altre dichiarazioni Come se anche impostarlo a zero

Affermazioni come utilizzo, impostare <option>, DEALLOCATE CURSOR, il cursore CLOSE, BEGIN TRANSACTION o COMMIT TRANSACTION reimpostare il valore ROWCOUNT a 0.

+0

1 - Per quanto ho capito, motivo per cui @@ rowcount ha restituito 1 e non 0 è dovuto alla query "SELECT @row, @@ rowcount" che interessa una riga. Ma ho pensato che il termine "numero di righe interessate" fosse usato quando l'istruzione sql si occupava di righe effettive nelle tabelle DB, ma l'istruzione select non ha accesso a nessuna riga, quindi perché @@ rowcount restituisce 1? – user702769

+0

2 - Spero che questa domanda abbia un senso: se dovessimo eseguire il nitpick, non @@ rowcount restituirà il numero di righe GIÀ influenzate dall'istruzione select? Se è così, quindi "SELEZIONA @row, @@ rowcount" dovrebbe restituire 0 per il conteggio delle righe @@, poiché l'istruzione select non è stata ancora completamente completata nel momento in cui recupera un valore da @@ rowcount e pertanto nessuna riga è stata influenzata ancora?! – user702769

+1

@ user702769: Il conteggio delle righe @@ in 'SELECT @row, @@ rowcount' è influenzato dal' set @row = @@ rowcount; 'sopra di esso. Un SELECT non può leggere il proprio numero @@ rowcount – gbn

0

Bene, Ho affrontato un problema simile usando sybase, che indica che qualcosa potrebbe essere sbagliato con "if".

declare @counter1 int 
declare @counter2 int 

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

l'output è: COUNTER1 = 3 COUNTER2 = 0

mi si aspetterebbe 3 (originale) o 1 (a causa di Select).

Questo è ancora più strano perché di http://infocenter.sybase.com/help/index.jsp?topic=/com.sybase.infocenter.dc38151.1540/doc/html/san1278452893271.html

"Il @@ rowcount non è azzerato qualsiasi dichiarazione che non influisce file, come ad esempio un'istruzione IF." su altra parte c'è un sacco di confusione come funziona davvero (sulla base di discussione in internet)

Alla fine della mia soluzione in prima linea assegno @@ rowcount alla variabile e la mia logica è basata su quella variabile

+0

Sì, sono stato sorpreso di scoprire (nel modo più duro) che in SQL Server @@ rowcount viene reimpostato da un'istruzione "if". –