Sql

While цикл sql: WHILE (Transact-SQL) — SQL Server

WHILE (Transact-SQL) — SQL Server

Twitter LinkedIn Facebook Адрес электронной почты

  • Статья
  • Чтение занимает 2 мин

Применимо к: SQL Server Azure SQL DatabaseУправляемый экземпляр SQL AzureAzure Synapse AnalyticsAnalytics Platform System (PDW)

Ставит условие повторного выполнения SQL-инструкции или блока инструкций. Эти инструкции вызываются в цикле, пока указанное условие истинно. Вызовами инструкций в цикле WHILE можно контролировать из цикла с помощью ключевых слов BREAK и CONTINUE.

Соглашения о синтаксисе Transact-SQL

Синтаксис

-- Syntax for SQL Server and Azure SQL Database  
  
WHILE Boolean_expression   
     { sql_statement | statement_block | BREAK | CONTINUE }  
  
-- Syntax for Azure Azure Synapse Analytics and Parallel Data Warehouse  
  
WHILE Boolean_expression   
     { sql_statement | statement_block | BREAK }  
  

Примечание

Ссылки на описание синтаксиса 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, затем выполнение цикла WHILE прекращается, о чем выводится соответствующее сообщение.

USE AdventureWorks2012;  
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';  

Б. Применение инструкции WHILE в курсоре

В следующем примере используется переменная @@FETCH_STATUS для управления действиями курсора в цикле WHILE.

DECLARE @EmployeeID as NVARCHAR(256)
DECLARE @Title as NVARCHAR(50)
DECLARE Employee_Cursor CURSOR FOR  
SELECT LoginID, JobTitle   
FROM AdventureWorks2012.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  

См. также

ALTER TRIGGER (Transact-SQL)
Язык управления потоком (Transact-SQL)
CREATE TRIGGER (Transact-SQL)
Курсоры (Transact-SQL)
SELECT (Transact-SQL)

sql — Update через цикл While

Вопрос задан

Изменён 22 дня назад

Просмотрен 851 раз

Подскажите пожалуйста: Есть таблица t1 в ней есть поля допустим ID, FirstValue, SecondValue

ID  FirstValue    SecondValue
 1     null         1. 1 клиент
 2     null         Вася
 3     null         Петя
 4     null         1.2 партнеры
 5     null         Газпром
 6     null         USA

нужно проитерировать чтоб получился такой результат,только не курсором а циклом:

ID     FirstValue        SecondValue
 1     1.1 клиент         1.1 клиент
 2     1.1 клиент         Вася
 3     1.1 клиент         Петя
 4     1.2 партнеры       1.2 партнеры
 5     1.2 партнеры       Газпром
 6     1.2 партнеры       USA

Подскажите как? можно на словах)

  • sql
  • sql-server

2

Разобрался спасибо!

   set nocount on
   if isnull(object_id('tempdb..#t1'),0) <> 0
     drop table #t1
    create table #t1 (
                     ID          int identity(1,1),
                     FirstValue  varchar(20),
                     SecondValue varchar(20)
                     )
    insert into #t1 (FirstValue, SecondValue)
    select '', '1. 1 Клиенты'  union all
    select '', 'Клиент 1'     union all
    select '', 'Клиент 2'     union all
    select '', 'Клиент 3'     union all
    select '', '1.2 Партнеры' union all
    select '', 'Партнер 1'    union all
    select '', 'Партнер 2'    union all
    select '', 'Партнер 3'    
    begin tran
    declare @ID          int,
            @SecondValue varchar(20)
    select @ID          = 0,
           @SecondValue = ''
    while 1 = 1
    begin
    select @ID = min(ID)
      from #t1
     where ID > @ID
    if @ID is null break
    select @SecondValue = SecondValue
      from #t1
     where ID = @ID
    if isnull(@SecondValue,'') <> ''
    begin
      update #t1
      set FirstValue = (
                        select top 1 SecondValue
                          from #t1
                         where ID <= @ID
                           and SecondValue like '1.%'
                        order by ID desc
                       )
      where ID = @ID
    end
    end
    rollback

Получается:

1

Зарегистрируйтесь или войдите

Регистрация через Google

Регистрация через Facebook

Регистрация через почту

Отправить без регистрации

Почта

Необходима, но никому не показывается

Отправить без регистрации

Почта

Необходима, но никому не показывается

Нажимая на кнопку «Отправить ответ», вы соглашаетесь с нашими пользовательским соглашением, политикой конфиденциальности и политикой о куки

SQL Server WHILE — Как создать цикл в SQL Server

Резюме : в этом руководстве вы узнаете, как использовать оператор SQL Server WHILE для многократного выполнения блока операторов на основе указанного условия.

Обзор оператора

WHILE

Оператор WHILE представляет собой оператор потока управления, который позволяет многократно выполнять блок операторов до тех пор, пока заданное условие TRUE .

Ниже показан синтаксис оператора

WHILE :

 

WHILE Boolean_expression { sql_statement | блок_операторов}

Язык кода: SQL (язык структурированных запросов) (sql)

В этом синтаксисе:

Во-первых, Boolean_expression — это выражение, которое оценивается как TRUE или FALSE .

Второй, sql_statement | statement_block — это любая инструкция Transact-SQL или набор инструкций Transact-SQL. Блок операторов определяется с помощью BEGIN...END инструкция.

Если Boolean_expression оценивается как FALSE при входе в цикл, никакие операторы внутри цикла

WHILE выполняться не будут.

Внутри цикла WHILE необходимо изменить некоторые переменные, чтобы Boolean_expression возвращал FALSE в некоторых точках. В противном случае у вас будет неопределенный цикл.

Обратите внимание, что если Boolean_expression содержит Оператор SELECT должен быть заключен в круглые скобки.

Чтобы немедленно выйти из текущей итерации цикла, используйте оператор BREAK . Чтобы пропустить текущую итерацию цикла и запустить новую, используется оператор CONTINUE .

SQL Server

WHILE пример

Давайте рассмотрим пример использования оператора SQL Server WHILE , чтобы лучше понять его.

В следующем примере показано, как использовать WHILE оператор для вывода чисел от 1 до 5:

 

DECLARE @counter INT = 1; ПОКА @counter <= 5 НАЧИНАТЬ ПЕЧАТЬ @счетчик; SET @счетчик = @счетчик + 1; КОНЕЦ

Язык кода: SQL (язык структурированных запросов) (sql)

Вывод:

 1
2
3
4
5 

В этом примере:

  • Сначала мы объявили переменную @counter и установили ее значение равным единице.
  • Затем, в состоянии WHILE , мы проверили, меньше или равно значение @counter пяти. Если это было не так, мы распечатывали @counter и увеличивали его значение на единицу. После пяти итераций @counter равен 6, что вызвало условие WHILE , оцениваемое как FALSE , цикл остановился.

Чтобы узнать, как использовать цикл WHILE для обработки построчно, ознакомьтесь с учебным пособием по курсору.

Из этого руководства вы узнали, как использовать SQL Server WHILE оператор для повторения выполнения блока операторов на основе указанного условия.

Циклы в SQL Server

В SQL Server цикл — это метод, при котором набор операторов SQL выполняется многократно, пока не будет выполнено условие.

SQL Server поддерживает цикл WHILE. Выполнением операторов можно управлять из блока WHLE с помощью ключевых слов BREAK и CONTINUE.

 ПОКА <состояние>
    Оператор SQL | блок_операторов | ПЕРЕРЫВ | ПРОДОЛЖИТЬ
 

Boolean_expression : Логическое выражение, которое возвращает TRUE или FALSE.

sql_statement | блок_операторов: один или группа операторов SQL (блок операторов). Блок операторов должен быть заключен с ключевыми словами BEGIN и END.

BREAK: Заставляет поток выйти из самого внутреннего цикла WHILE. Операторы после ключевого слова END выполняются после BREAK.

CONTINUE: перезапускает цикл WHILE. Он игнорирует все операторы после ключевого слова CONTINUE.

Пока Цикл

В следующем примере цикл WHILE используется для печати чисел.

 DECLARE @i INT = 10;
 
ПОКА @i 

Ниже показан результат в SSMS.

В приведенном выше примере целочисленная переменная @i установлена ​​на 10. Условие цикла WHILE @i указывает, что он будет выполнять блок до @i равно 30. Блок внутри цикла WHILE заключен в ключевые слова BEGIN и END. Выводится переменная @i , а затем увеличивается на 10.

ПЕРЕРЫВ

В следующем примере для выхода из цикла используется ключевое слово BREAK.

 DECLARE @i INT = 10;
 
ПОКА @i 
Результат в SSMS

. В приведенном выше примере инструкция выводит значение переменной 9.0005 @i до тех пор, пока не будет достигнуто условие @i = 30 , при котором ключевое слово BREAK вступает в силу, и цикл завершается.

ПРОДОЛЖИТЬ

В следующем примере, когда условие цикла WHILE ( @i ) достигнуто, ключевое слово CONTINUE заставит цикл перейти в бесконечность, если вы не нажмете кнопку остановки. Когда @i = 30 , CONTINUE не позволяет выйти из цикла, как показано в результате ниже

 DECLARE @i INT = 10;
 
ПОКА @i 
Результат в SSMS

Вложенные циклы

В следующем примере демонстрируется вложенный цикл.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *