Как организовать цикл в sql
Для выполнения повторяющихся операций в T-SQL применяются циклы. В частности, в T-SQL есть цикл WHILE . Этот цикл выполняет определенные действия, пока некоторое условие истинно.
WHILE условие
Если в блоке WHILE необходимо разместить несколько инструкций, то все они помещаются в блок BEGIN. END.
Например, вычислим факториал числа:
DECLARE @number INT, @factorial INT SET @factorial = 1; SET @number = 5; WHILE @number > 0 BEGIN SET @factorial = @factorial * @number SET @number = @number - 1 END; PRINT @factorial
То есть в данном случае пока переменная @number не будет равна 0, будет продолжаться цикл WHILE. Так как @number равна 5, то цикл сделает пять проходов. Каждый проход цикла называется итерацией. В каждой итерации будет переустанавливаться значение переменных @factorial и @number.
Другой пример — рассчитаем баланс счета через несколько лет с учетом процентной ставки:
USE productsdb; CREATE TABLE #Accounts ( CreatedAt DATE, Balance MONEY) DECLARE @rate FLOAT, @period INT, @sum MONEY, @date DATE SET @date = GETDATE() SET @rate = 0.065; SET @period = 5; SET @sum = 10000; WHILE @period > 0 BEGIN INSERT INTO #Accounts VALUES(@date, @sum) SET @period = @period - 1 SET @date = DATEADD(year, 1, @date) SET @sum = @sum + @sum * @rate END; SELECT * FROM #Accounts
Здесь создается временная таблица #Accounts, в которую добавляется в цикле пять строк с данными.

Операторы BREAK и CONTINUE
Оператор BREAK позволяет завершить цикл, а оператор CONTINUE — перейти к новой итерации.
DECLARE @number INT SET @number = 1 WHILE @number < 10 BEGIN PRINT CONVERT(NVARCHAR, @number) SET @number = @number + 1 IF @number = 7 BREAK; IF @number = 4 CONTINUE; PRINT 'Конец итерации' END;
Когда переменная @number станет равна 4, то с помощью оператора CONTINUE произойдет переход к новой итерации, поэтому последующая строка PRINT 'Конец итерации' не будет выполняться, хотя цикл продолжится.
Когда переменная @number станет равна 7, то оператор BREAK произведет выход из цикла, и он завершится.
WHILE (Transact-SQL)
Ставит условие повторного выполнения SQL-инструкции или блока инструкций. Эти инструкции вызываются в цикле, пока указанное условие истинно. Вызовами инструкций в цикле WHILE можно контролировать из цикла с помощью ключевых слов BREAK и CONTINUE.
Синтаксис
-- Syntax for SQL Server and Azure SQL Database and Microsoft Fabric WHILE Boolean_expression
-- Syntax for Azure Azure Synapse Analytics and Parallel Data Warehouse WHILE Boolean_expression
Сведения о синтаксисе Transact-SQL для SQL Server 2014 (12.x) и более ранних версиях см . в документации по предыдущим версиям.
Аргументы
Boolean_expression
Выражение, возвращающее значение TRUE или FALSE. Если логическое выражение содержит инструкцию SELECT, инструкция SELECT должна быть заключена в скобки.
sql_statement | statement_block>
Любая инструкция или группа инструкций Transact-SQL, определенная в виде блока инструкций. Для определения блока инструкций используйте ключевые слова потока управления BEGIN и END.
BREAK
Приводит к выходу из ближайшего цикла WHILE. Вызываются инструкции, следующие за ключевым словом END, обозначающим конец цикла.
Продолжить
Выполняет цикл WHILE для перезагрузки, не учитывая все инструкции, следующие после ключевого слова CONTINUE.
Замечания
Если вложенными являются два цикла WHILE или более, внутренний оператор BREAK существует до следующего внешнего цикла. Все инструкции после окончания внутреннего цикла выполняются в первую очередь, а затем перезапускается следующий внешний цикл.
Примеры
А. Использование ключевых слов BREAK и CONTINUE внутри вложенных конструкций IF. ELSE и WHILE
В следующем примере в случае, если средняя цена продуктов из списка меньше чем $300 , цикл WHILE удваивает цены, а затем выбирает максимальную. В том случае, если максимальная цена меньше или равна $500 , цикл WHILE повторяется и снова удваивает цены. Этот цикл продолжает удваивать цены до тех пор, пока максимальная цена не будет больше чем $500 , затем выполнение цикла WHILE прекращается, о чем выводится соответствующее сообщение.
USE AdventureWorks2022; GO WHILE (SELECT AVG(ListPrice) FROM Production.Product) < $300 BEGIN UPDATE Production.Product SET ListPrice = ListPrice * 2 SELECT MAX(ListPrice) FROM Production.Product IF (SELECT MAX(ListPrice) FROM Production.Product) >$500 BREAK ELSE CONTINUE END PRINT 'Too much for the market to bear';
B. Применение инструкции WHILE в курсоре
В следующем примере используется переменная @@FETCH_STATUS для управления действиями курсора в цикле WHILE .
DECLARE @EmployeeID as NVARCHAR(256) DECLARE @Title as NVARCHAR(50) DECLARE Employee_Cursor CURSOR FOR SELECT LoginID, JobTitle FROM AdventureWorks2022.HumanResources.Employee WHERE JobTitle = 'Marketing Specialist'; OPEN Employee_Cursor; FETCH NEXT FROM Employee_Cursor INTO @EmployeeID, @Title; WHILE @@FETCH_STATUS = 0 BEGIN Print ' ' + @EmployeeID + ' '+ @Title FETCH NEXT FROM Employee_Cursor INTO @EmployeeID, @Title; END; CLOSE Employee_Cursor; DEALLOCATE Employee_Cursor; GO
Примеры: Azure Synapse Analytics и система платформы аналитики (PDW)
В. Простой цикл While
В следующем примере в случае, если средняя цена продуктов из списка меньше чем $300 , цикл WHILE удваивает цены, а затем выбирает максимальную. В том случае, если максимальная цена меньше или равна $500 , цикл WHILE повторяется и снова удваивает цены. Этот цикл продолжает удваивать цены до тех пор, пока максимальная цена не будет больше, чем $500 , после чего выполнение цикла WHILE прекращается.
-- Uses AdventureWorks WHILE ( SELECT AVG(ListPrice) FROM dbo.DimProduct) < $300 BEGIN UPDATE dbo.DimProduct SET ListPrice = ListPrice * 2; SELECT MAX ( ListPrice) FROM dbo.DimProduct IF ( SELECT MAX (ListPrice) FROM dbo.DimProduct) >$500 BREAK; END
Sql script цикл
Необязательно зацикливаться на курсорах - есть же еще старый-добрый while (для наглядности, пример для того случая, когда поле UserId первичный ключ):
declare @id int = 0 while exists(select 1 from Users where UserId >= @id) begin select top(1) @id = UserId from Users where UserId >= @id -- необходимые операции set @id = @id + 1 end
Отслеживать
ответ дан 13 ноя 2015 в 15:29
1,382 12 12 серебряных знаков 22 22 бронзовых знака
Отслеживать
ответ дан 6 сен 2013 в 21:50
1,675 1 1 золотой знак 10 10 серебряных знаков 15 15 бронзовых знаков
Думаю, что вам нужны соединения. А циклы - это процедурный подход, которого следует избегать по возможности.
Отслеживать
ответ дан 7 сен 2013 в 6:05
11.5k 16 16 серебряных знаков 16 16 бронзовых знаков
Если без цикла совсем никак не обойтись, то можно использовать курсор:
DECLARE @UserID int DECLARE user_cursor CURSOR FOR SELECT UserID FROM Users OPEN user_cursor FETCH NEXT FROM user_cursor INTO @UserID WHILE @@FETCH_STATUS = 0 BEGIN -- сделать что-то с текущим @UserID FETCH NEXT FROM user_cursor INTO @UserID END CLOSE user_cursor; DEALLOCATE user_cursor;
Хранимые процедуры: организовать цикл while, используя TSQL
Всем доброго времени суток!
Вопрос: Как организовать цикл WHILE используя язык Transact SQL? А конкретно из таблицы выбрать поочередно все значения в некотором заданном диапазоне? За примеры буду очень признателен.
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:
Редактирования кода хранимой процедуры через TSQL
Есть две базы А и Б, у них есть одинаковые по имени хранимые процедуры, требуется взять код.
Цикл: Организовать цикл расчёта текущего члена ряда и текущей суммы ряда, используя их предыдущие значения.
Ввести переменную X с клавиатуры, задать начальные значения для члена ряда, суммы ряда.
Создание хранимой процедуры, которая создает хранимые процедуры
Написать хранимую процедуру SQL , которая будет создавать хранимые процедуры(любые) для БД.
Переделать процедуры используя цикл вайл
Нужно переделать, в первой процедуре начал, запутался и не получилось и еще, почему то стало.
66 / 64 / 24
Регистрация: 14.10.2014
Сообщений: 338
Может быть имелся ввиду курсор?
О While с примерами читаем здесь, а вот здесь о курсорах. Все с примерами и на русском.
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Помогаю со студенческими работами здесь
Хранимые процедуры
Здравствуйте форумчане! Подскажите пожалуйста: 1. Как создать хранимые процедуры для добавления.
Хранимые процедуры
Здравствуйте! Помогите пожалуйста с хранимой процедурой: Таблицы: Items (id, products_id.
Хранимые процедуры
Люди, никто не знает какая команда, или директива запрещает возврат данных из хранимой процедуры.

Хранимые процедуры
Добрый день,помогите,ребят) Создаю базу данных английского чемпионата,вот столкнулся с проблемами.
