Eseguire un'iterazione in un set di risultati tramite Transact-SQL in SQL Server

In questo articolo vengono descritti i diversi metodi che è possibile utilizzare per eseguire un'iterazione in un set di risultati tramite Transact-SQL in SQL Server.

Versione originale del prodotto:   SQL Server
Numero KB originale:   111401

Riepilogo

In questo articolo vengono descritti i diversi metodi che è possibile utilizzare per simulare una logica di FETCH-NEXT simile a un cursore in una stored procedure, un trigger o un batch Transact-SQL.

Utilizzare le istruzioni Transact-SQL per eseguire un'iterazione in un set di risultati

Sono disponibili tre metodi che è possibile utilizzare per eseguire un'iterazione in un set di risultati tramite istruzioni Transact-SQL.

Un metodo è l'utilizzo delle tabelle temp. Con questo metodo, è possibile creare uno snapshot dell' SELECT istruzione iniziale e utilizzarlo come base per il cursore. Ad esempio:

/********** example 1 **********/
declare @au_id char( 11 )

set rowcount 0
select * into #mytemp from authors

set rowcount 1

select @au_id = au_id from #mytemp

while @@rowcount <> 0

begin
set rowcount 0
select * from #mytemp where au_id = @au_id
delete #mytemp where au_id = @au_id

set rowcount 1
select @au_id = au_id from #mytemp<BR/>
end
set rowcount 0

Un secondo metodo consiste nell'utilizzare la min funzione per eseguire il percorso di una tabella una riga alla volta. Questo metodo intercetta nuove righe aggiunte dopo l'esecuzione della stored procedure, purché la nuova riga abbia un identificatore univoco superiore alla riga corrente elaborata nella query. Ad esempio:

/********** example 2 **********/
declare @au_id char( 11 )

select @au_id = min( au_id ) from authors
while @au_id is not null

begin
select * from authors where au_id = @au_id
select @au_id = min( au_id ) from authors where au_id > @au_id
end

Nota

Entrambi gli esempi 1 e 2 presumono che esista un identificatore univoco per ogni riga della tabella di origine. In alcuni casi, non possono esistere identificatori univoci. In caso contrario, è possibile modificare il metodo tabella temporanea per utilizzare una colonna chiave appena creata. Ad esempio:

/********** example 3 **********/
set rowcount 0
select NULL mykey, * into #mytemp from authors

set rowcount 1
update #mytemp set mykey = 1

while @@rowcount > 0
begin
set rowcount 0
select * from #mytemp where mykey = 1
delete #mytemp where mykey = 1
set rowcount 1
update #mytemp set mykey = 1
end
set rowcount 0

Riferimenti

ROW_NUMBER (Transact-SQL)