While ms sql: WHILE (Transact-SQL) — SQL Server

ПОКА (Transact-SQL) — SQL Server

Редактировать

Твиттер

LinkedIn

Фейсбук

Электронная почта

  • Статья

Применяется к: 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.