Iterar por meio de um conjunto de resultados usando o Transact-SQL em SQL Server

Este artigo descreve vários métodos que você pode usar para iterar por meio de um conjunto de resultados usando o Transact-SQL em SQL Server.

Versão original do produto: SQL Server
Número de KB original: 111401

Resumo

Este artigo descreve vários métodos que você pode usar para simular uma lógica semelhante FETCH-NEXT a um cursor em um procedimento armazenado, gatilho ou lote Transact-SQL.

Usar instruções Transact-SQL para iterar por meio de um conjunto de resultados

Há três métodos que você pode usar para iterar por meio de um conjunto de resultados usando instruções Transact-SQL.

Um método é o uso de tabelas temporárias. Com esse método, você cria uma instantâneo da instrução inicial SELECT e a usa como base para cursor. Por exemplo:

/********** 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

Um segundo método é usar a min função para andar uma tabela uma linha por vez. Esse método captura novas linhas que foram adicionadas após o início da execução do procedimento armazenado, desde que a nova linha tenha um identificador exclusivo maior que a linha atual que está sendo processada na consulta. Por exemplo:

/********** 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

Observação

O exemplo 1 e 2 pressupõem que exista um identificador exclusivo para cada linha na tabela de origem. Em alguns casos, nenhum identificador exclusivo pode existir. Se esse for o caso, você poderá modificar o método de tabela temporária para usar uma coluna de chave recém-criada. Por exemplo:

/********** 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

Referências

ROW_NUMBER (Transact-SQL)