2010-08-26 15 views

risposta

13

perché questo if @i=0

set a 0, anche una dichiarazione di stampa viene impostato a 0

ora eseguire questo

declare @i int, @RowNum int 
set @i=0 
while @i<2 
begin 
    if @i=0 
    begin 
     execute StoredProcedure @i --containing a big select 
     set @[email protected]@rowcount 
    end 
    else 
    execute StoredProcedure @i 
    set @[email protected]+1 
end 
print @RowNum 

Ecco un altro esempio

select 1 
union all 
select 2 

select @@rowcount --2 
go 

ora sarà 0

select 1 
union all 
select 2 
if 1=1 
select @@rowcount --0 

STAMPA scombina anche in su, questa sarà 2

select 1 
union all 
select 2 

select @@rowcount --2 
go 

questo sarà 0

select 1 
union all 
select 2 

print '1' 
select @@rowcount -- 0 

ho creato un post con più esempi e spiegazioni qui: When should you store @@ROWCOUNT into a variable?

+0

dopo che il risultato è stato resettato, ho anche aggiunto un esempio di stampa, @@ errore ha lo stesso comportamento – SQLMenace

+0

E 'richiesto un comportamento che · se @ i = 0 · interessa il valore di @ rowcount? Vedete, ho bisogno del numero di riga del primo set di risultati. Come posso ottenerlo? – phoenies

+0

vedi codice modificato, se il tuo altro ha bisogno di più di 1 affermazione, quindi aggiungi BEGIN END intorno ad esso – SQLMenace

0

Suppongo che la risposta di SQLMenace sia corretta, b aggiungere: "Non farebbe quello che vuoi?":

declare @RowNum int 
    execute StoredProcedure 0 
    set @[email protected]@rowcount 
    execute StoredProcedure 1 
    print @RowNum 
+0

Il codice di esempio è impreciso. Quello che dopo 'execute' è in realtà una stringa generata dinamicamente, che è molto complicata. Io davvero non preferisco ripetere la parte generatrice del codice. – phoenies

0

Eviterei questo stile in generale. Se si recupera il numero di righe selezionate da una tabella nell'SP interrogando @@ rowcount dopo la chiamata alla procedura, si sta effettivamente introducendo una dipendenza non necessaria su come la procedura viene implementata all'interno e si compromette l'explicitness. Se in seguito si modifica l'implementazione della procedura, è possibile che il codice venga interrotto all'esterno e non sarebbe evidente durante la modifica dell'SP. Dovresti invece utilizzare il parametro di output indicato in modo appropriato.

+0

Hai ragione. Il codice di esempio è impreciso. Infatti è una stringa piuttosto che un SP. – phoenies