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
Вложенные циклы
В следующем примере демонстрируется вложенный цикл.
1 клиент
2 null Вася
3 null Петя
4 null 1.2 партнеры
5 null Газпром
6 null USA
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
