While ms sql: WHILE (Transact-SQL) — SQL Server
Содержание
ПОКА (Transact-SQL) — SQL Server
Редактировать
Твиттер
Фейсбук
Электронная почта
- Статья
Применяется к: SQL Server Azure SQL База данных Azure SQL Управляемый экземпляр Azure Synapse Analytics Analytics Platform System (PDW)
Задает условие для повторного выполнения оператора SQL или блока операторов. Операторы выполняются многократно, пока заданное условие истинно. Выполнение операторов в цикле WHILE можно контролировать изнутри цикла с помощью ключевых слов BREAK и CONTINUE.
Соглашения о синтаксисе Transact-SQL
Синтаксис
-- Синтаксис для SQL Server и базы данных SQL Azure WHILE Boolean_expression { sql_statement | блок_операторов | ПЕРЕРЫВ | ПРОДОЛЖАТЬ }
-- Синтаксис для Azure Azure Synapse Analytics и хранилища параллельных данных WHILE Boolean_expression { sql_statement | блок_операторов | ПЕРЕРЫВ }
Примечание
Чтобы просмотреть синтаксис Transact-SQL для SQL Server 2014 и более ранних версий, см. документацию по предыдущим версиям.
Аргументы
Boolean_expression
Является выражением, которое возвращает TRUE или FALSE . Если логическое выражение содержит оператор SELECT, оператор SELECT должен быть заключен в круглые скобки.
{ sql_statement | statement_block }
Любой оператор Transact-SQL или группа операторов, определенная с помощью блока операторов. Чтобы определить блок операторов, используйте ключевые слова управления потоком BEGIN и END.
BREAK
Вызывает выход из самого внутреннего цикла WHILE. Любые операторы, которые появляются после ключевого слова END, обозначающего конец цикла, выполняются.
CONTINUE
Вызывает перезапуск цикла WHILE, игнорируя все операторы после ключевого слова CONTINUE.
Если два или более цикла WHILE вложены друг в друга, внутренний BREAK переходит к следующему самому внешнему циклу. Сначала выполняются все операторы после окончания внутреннего цикла, а затем перезапускается следующий внешний цикл.
Примеры
A. Использование BREAK и CONTINUE с вложенными IF…ELSE и WHILE
В следующем примере, если средняя прейскурантная цена продукта меньше $300
, цикл WHILE
удваивает цены, а затем выбирает максимальная цена. Если максимальная цена меньше или равна $500
, цикл WHILE
перезапускается и снова удваивает цены. Этот цикл продолжает удваивать цены до тех пор, пока максимальная цена не превысит $ 500
, а затем выходит из 9-го диапазона.0065 ПОКА цикл и печатает сообщение.
ИСПОЛЬЗОВАТЬ AdventureWorks2012; ИДТИ ПОКА (ВЫБЕРИТЕ СРЕДНЮЮ (ListPrice) ИЗ Production.Product) < $300 НАЧИНАТЬ ОБНОВЛЕНИЕ Производство.Продукт УСТАНОВИТЬ СписокЦена = СписокЦена * 2 SELECT MAX (ListPrice) FROM Production.Product ЕСЛИ (ВЫБЕРИТЕ МАКС.(СписокЦен) ИЗ Производство.Продукт) > 500 долл. США ПЕРЕРЫВ ЕЩЕ ПРОДОЛЖАТЬ КОНЕЦ PRINT «Слишком много для рынка»;
B.
Использование WHILE в курсоре
В следующем примере используется @@FETCH_STATUS
для управления действиями курсора в цикле WHILE
.
ОБЪЯВИТЬ @EmployeeID как NVARCHAR(256) DECLARE @Title как NVARCHAR(50) DECLARE Employee_Cursor CURSOR FOR ВЫБЕРИТЕ LoginID, JobTitle ОТ AdventureWorks2012.HumanResources.Employee ГДЕ JobTitle = 'Специалист по маркетингу'; ОТКРЫТЬ Сотрудник_Курсор; FETCH NEXT FROM Employee_Cursor INTO @EmployeeID, @Title; ПОКА @@FETCH_STATUS = 0 НАЧИНАТЬ Вывести ' ' + @EmployeeID + ' '+ @Title FETCH NEXT FROM Employee_Cursor INTO @EmployeeID, @Title; КОНЕЦ; ЗАКРЫТЬ Сотрудник_Курсор; DEALLOCATEEmployee_Cursor; ИДТИ
Примеры: Azure Synapse Analytics and Analytics Platform System (PDW)
C: Простой цикл While
В следующем примере, если средняя прейскурантная цена продукта меньше 300 долларов США цены, а затем выбирает максимальную цену. Если максимальная цена меньше или равна
, а затем выходит из цикла $500
, цикл WHILE
перезапускается и снова удваивает цены. Этот цикл продолжает удваивать цены до тех пор, пока максимальная цена не превысит 9.0065 $500 WHILE
.
-- Использует AdventureWorks ПОКА (ВЫБРАТЬ AVG(ListPrice) FROM dbo.DimProduct) < $300 НАЧИНАТЬ ОБНОВЛЕНИЕ dbo.DimProduct УСТАНОВИТЬ СписокЦена = СписокЦена * 2; ВЫБЕРИТЕ МАКСИМАЛЬНОЕ (ListPrice) ИЗ dbo.DimProduct ЕСЛИ ( ВЫБЕРИТЕ МАКСИМАЛЬНУЮ (ListPrice) ИЗ dbo.DimProduct) > 500 долларов США ПЕРЕРЫВ; КОНЕЦ
См. также
ALTER TRIGGER (Transact-SQL)
Язык управления потоком (Transact-SQL)
CREATE TRIGGER (Transact-SQL)
Курсоры (Transact-SQL)
SELECT (Transact-SQL)
Цикл SQL WHILE с простыми примерами
Цикл SQL WHILE дает нам преимущество многократного выполнения операторов SQL до тех пор, пока указанный результат условия не окажется ложным.
В следующих разделах этой статьи мы будем использовать больше блок-схем, чтобы объяснить понятия и примеры. По этой причине, во-первых, мы кратко объясним, что такое блок-схема. Блок-схема — это наглядный геометрический символ, помогающий наглядно объяснить алгоритмы. Блок-схема используется для простого проектирования и документирования алгоритмов. На блок-схеме каждый геометрический символ имеет разные значения.
Следующая блок-схема объясняет основную структуру цикла WHILE в SQL:
Как видите, в каждой итерации цикла проверяется заданное условие, а затем по результату условия определяется поток кода. Если результат условия истинен, оператор SQL будет выполнен. В противном случае поток кода выйдет из цикла. Если какой-либо оператор SQL существует вне цикла, он будет выполнен.
Синтаксис и пример цикла SQL WHILE
Синтаксис цикла WHILE в SQL выглядит следующим образом:
WHILE условие BEGIN {…операторы…} END |
После этих объяснений мы приведем очень простой пример цикла WHILE в SQL. В приведенном ниже примере пример цикла WHILE запишет значение переменной десять раз, после чего цикл завершится:
1 2 3 4 5 6 7 | DECLARE @Counter INT SET @Counter=1 WHILE ( @Counter <= 10) BEGIN PRINT ‘Значение счетчика = ‘ + CONVERT(VARCHAR,@Counter) SET @Counter = @Counter + 1 КОНЕЦ |
Теперь мы обработаем пример цикла WHILE построчно и детально изучим его.
В этой части кода мы объявляем переменную и присваиваем ей инициализирующее значение:
DECLARE @Counter INT SET @Counter=1 |
Эта часть кода имеет указанное условие, что пока значение переменной не достигнет 10, цикл продолжается и выполняет оператор PRINT. В противном случае условие while не сработает и цикл завершится:
ПОКА ( @Counter <= 10) |
В этой последней части кода мы выполнили оператор SQL, а затем увеличили значение переменной:
BEGIN PRINT ‘Значение счетчика = ‘ + CONVERT(VARCHAR,@Counter) SET @Counter = @Counter + 1 END |
Следующая блок-схема наглядно иллюстрирует этот пример цикла WHILE:
Бесконечный цикл SQL WHILE
В бесконечном цикле, также известном как бесконечный цикл, результат условия никогда не будет ложным, поэтому цикл никогда не заканчивается и может работать вечно. Представьте, что у нас есть цикл WHILE, и мы не увеличиваем значение переменной. В этом случае цикл выполняется бесконечно и никогда не заканчивается. Теперь мы реализуем этот сценарий с помощью следующего примера. Нам нужно учесть одну вещь, что мы не должны забывать отменять выполнение запроса вручную:
1 2 3 4 5 6 7 | DECLARE @Counter INT SET @Counter=1 WHILE ( @Counter <= 10) BEGIN PRINT ‘Кто-нибудь меня остановит!’
КОНЕЦ |
На следующей блок-схеме очевидно, что значение переменной никогда не меняется; поэтому цикл никогда не заканчивается. Причина этой проблемы в том, что переменная всегда равна 1, поэтому условие возвращает true для каждой итерации цикла:
Оператор BREAK
Оператор BREAK используется в цикле SQL WHILE для немедленного выхода из текущей итерации цикла при возникновении определенных условий. Обычно оператор IF…ELSE используется для проверки того, произошло ли условие или нет. Дополнительные сведения об операторе IF…ELSE см. во вводной и обзорной статье инструкции SQL IF.
В следующем примере показано использование оператора BREAK в цикле WHILE:
1 2 3 4 5 6 7 8 9 9 0003 10 11 | DECLARE @Counter INT SET @Counter=1 WHILE ( @Counter <= 10) BEGIN PRINT ‘Значение счетчика = ‘ + CONVERT(VARCHAR,@Counter) 9 0003 ЕСЛИ @Счетчик > =7 НАЧАЛО РАЗРЫВ КОНЕЦ SET @Counter = @Counter + 1 END |
В этом примере мы проверили значение переменной, и когда значение равно или больше 7, код вошел в блок IF…ELSE и выполнил оператор BREAK, поэтому он немедленно вышел из цикла. По этой причине в сообщении отображаются значения переменной до 7. Если условие оператора IF…ELSE не выполняется, цикл будет выполняться до тех пор, пока результат условия не станет ложным. Следующая блок-схема наглядно объясняет рабочую логику примера оператора BREAK:
Оператор ПРОДОЛЖИТЬ
Оператор CONTINUE используется в цикле SQL WHILE, чтобы остановить текущую итерацию цикла при возникновении определенных условий, а затем начать новую итерацию с начала цикла. Предположим, что мы хотим записать в цикле WHILE только четные числа. Чтобы решить эту проблему, мы можем использовать оператор CONTINUE . В следующем примере мы проверим, является ли значение переменной нечетным или четным. Если значение переменной нечетное, код входит в блоки операторов IF…ELSE и увеличивает значение переменной, выполняя CONTINUE и начинает новую итерацию:
1 2 3 4 5 6 7 8 9 9 0003 10 11 12 13 | DECLARE @Counter INT SET @Counter=1 WHILE ( @Counter <= 20) BEGIN
IF @Counter % 2 =1 90 003 НАЧАЛО SET @Counter = @Counter + 1 CONTINUE END PRINT ‘Значение счетчика = ‘ + CONVERT(VARCHAR,@Counter) SET @Counter = @Counter + 1 КОНЕЦ |
Следующая блок-схема наглядно объясняет рабочую логику примера оператора CONTINUE:
Чтение записей таблицы через цикл WHILE
В следующем примере мы будем читать данные таблицы построчно. Сначала мы создадим пример таблицы:
1 2 3 4 5 6 7 8 9 9 0003 10 11 12 13 14 15 16 | ИСПОЛЬЗОВАТЬ tempdb GO УДАЛИТЬ ТАБЛИЦУ, ЕСЛИ СУЩЕСТВУЕТ SampleTable CREATE TABLE SampleTable (Id INT, CountryName NVARCHAR(100), ReadStatus TINYINT) GO INSERT INTO SampleTable (Id, CountryName, ReadStatus) Значения (1, ‘ Германия’, 0), (2, ‘Франция’, 0), (3, ‘Италия’, 0), (4, ‘Нидерланды’, 0) , (5, ‘Польша’, 0)
SELECT * FROM SampleTable |
На этом шаге мы будем читать все данные построчно с помощью цикла WHILE:
1 2 3 4 5 6 7 8 9 9 0003 10 11 12 13 14 15 16 17 | USE tempdb GO
DECLARE @Counter INT , @MaxId INT, @CountryName NVARCHAR(100) SELECT @Counter = min(Id), @MaxId = max(Id) FROM SampleTable 900 03 ПОКА(@Счетчик НЕ НУЛЬ И @Counter <= @MaxId) BEGIN SELECT @CountryName = CountryName FROM SampleTable WHERE Id = @Counter
PRINT CONVERT(VARCHAR,@Counter) + ‘. название страны ‘ + @CountryName SET @Counter = @Counter + 1 END |
В этом примере мы читаем строки таблицы через цикл WHILE. Мы также можем разрабатывать более сложные и продвинутые циклы в зависимости от наших потребностей.
Заключение
В этой статье мы изучили цикл SQL WHILE на довольно простых примерах. Мы также виртуализировали и объяснили примеры блок-схемами. Цикл WHILE помогает нам выполнять итерационные операции в SQL Server. В то же время операторы BREAK и CONTINUE можно использовать для управления итерацией цикла WHILE в SQL Server.
- Автор
- Последние сообщения
Esat Erkec
Esat Erkec — специалист по SQL Server, начавший свою карьеру более 8 лет назад в качестве разработчика программного обеспечения. Он является сертифицированным экспертом по решениям Microsoft для SQL Server.
Большая часть его карьеры была посвящена администрированию и разработке баз данных SQL Server.