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

Questo articolo descrive vari metodi che è possibile usare per scorrere un set di risultati usando Transact-SQL in SQL Server.

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

Riepilogo

Questo articolo descrive vari metodi che è possibile usare per simulare una logica simile FETCH-NEXT a un cursore in una stored procedure, un trigger o un batch Transact-SQL.

Usare istruzioni Transact-SQL per scorrere un set di risultati

Esistono tre metodi che è possibile usare per scorrere un set di risultati usando istruzioni Transact-SQL.

Un metodo è l'uso di tabelle temporanee. Con questo metodo si crea uno snapshot dell'istruzione iniziale SELECT e lo si usa 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
END
SET rowcount 0

Un secondo metodo consiste nell'usare la min funzione per esaminare una tabella una riga alla volta. Questo metodo intercetta le nuove righe aggiunte dopo l'avvio dell'esecuzione della stored procedure, a condizione che la nuova riga abbia un identificatore univoco maggiore della 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 presuppongono che esista un identificatore univoco per ogni riga della tabella di origine. In alcuni casi, non può esistere alcun identificatore univoco. In questo caso, è possibile modificare il metodo della tabella temporanea per usare 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)