Выполните итерацию по результирующем набору с помощью Transact-SQL в SQL Server

В этой статье описываются различные методы, которые можно использовать для итерации результирующих наборов с помощью Transact-SQL в SQL Server.

Оригинальная версия продукта: SQL Server
Исходный номер базы знаний: 111401

Сводка

В этой статье описываются различные методы, которые можно использовать для имитации логики, подобной FETCH-NEXT курсору, в хранимой процедуре, триггере или пакете Transact-SQL.

Использование инструкций Transact-SQL для итерации по результирующем набору

Существует три метода, которые можно использовать для итерации результирующих наборов с помощью инструкций Transact-SQL.

Одним из методов является использование временных таблиц. С помощью этого метода вы создаете snapshot начальной SELECT инструкции и используете его в качестве основы для курсора. Например:

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

Второй метод заключается в min использовании функции для обхода таблицы по одной строке за раз. Этот метод перехватывает новые строки, добавленные после начала выполнения хранимой процедуры, при условии, что новая строка имеет уникальный идентификатор, превышающий текущую строку, обрабатываемую в запросе. Например:

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

Примечание.

В примерах 1 и 2 предполагается, что для каждой строки в исходной таблице существует уникальный идентификатор. В некоторых случаях уникальный идентификатор не может существовать. В этом случае можно изменить метод временной таблицы, чтобы использовать только что созданный ключевой столбец. Например:

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

Ссылки

ROW_NUMBER (Transact-SQL)