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
.
Ниже показан синтаксис оператора
:
Язык кода: SQL (язык структурированных запросов) (sql)
WHILE Boolean_expression { sql_statement | блок_операторов}
В этом синтаксисе:
Во-первых, 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
Вложенные циклы
В следующем примере демонстрируется вложенный цикл.