Выполните итерацию по результирующем набору с помощью 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
Ссылки
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по