[do-while] Выполнять цикл while в SQL Server 2008. While sql цикл
loops - Выполнять цикл while в SQL Server 2008
Если вы не очень обиделись на ключевое слово GOTO, его можно использовать для имитации DO/WHILE в T-SQL. Рассмотрим следующий довольно бессмысленный пример, написанный в псевдокоде:
SET I=1 DO PRINT I SET I=I+1 WHILE I<=10Вот эквивалентный код T-SQL с использованием goto:
DECLARE @I INT=1; START: -- DO PRINT @I; SET @I+=1; IF @I<=10 GOTO START; -- WHILE @I<=10Обратите внимание на одно к одному сопоставление между решением GOTO enabled и исходным псевдокодом DO/WHILE. Аналогичная реализация с использованием цикла WHILE будет выглядеть так:
DECLARE @I INT=1; WHILE (1=1) -- DO BEGIN PRINT @I; SET @I+=1; IF NOT (@I<=10) BREAK; -- WHILE @I<=10 ENDТеперь вы можете, конечно, переписать этот конкретный пример как простой цикл WHILE, так как это не такой хороший кандидат для конструкции DO/WHILE. Акцент был сделан на примере краткости, а не на применимости, поскольку допустимые случаи, требующие DO/WHILE, встречаются редко.
REPEAT/UNTIL, кто-нибудь (не работает в T-SQL)?
SET I=1 REPEAT PRINT I SET I=I+1 UNTIL I>10... и решение на основе GOTO в T-SQL:
DECLARE @I INT=1; START: -- REPEAT PRINT @I; SET @I+=1; IF NOT(@I>10) GOTO START; -- UNTIL @I>10Благодаря творческому использованию GOTO и логической инверсии с помощью ключевого слова NOT существует очень тесная взаимосвязь между исходным псевдокодом и решением на основе GOTO. Аналогичное решение с использованием цикла WHILE выглядит следующим образом:
DECLARE @I INT=1; WHILE (1=1) -- REPEAT BEGIN PRINT @I; SET @I+=1; IF @I>10 BREAK; -- UNTIL @I>10 ENDМожно сделать аргумент, что для случая REPEAT/UNTIL решение на основе WHILE проще, поскольку условие if не инвертируется. С другой стороны, это также более подробно.
Если бы не все пренебрежительное отношение к использованию GOTO, это может быть даже идиоматическим решением для тех немногих раз, когда эти конкретные (злые) петлевые конструкции необходимы в коде T-SQL ради ясность.
Используйте их по своему усмотрению, пытаясь не терпеть гнев своих коллег-разработчиков, когда они поймают вас с помощью сильно клеветой GOTO.
qaru.site
Выполнять цикл while в SQL Server 2008 MS SQL Server
Есть ли какой-либо метод для реализации цикла while в SQL Server 2008?
Я не уверен в DO-WHILE IN MS SQL Server 2008, но вы можете изменить логику цикла WHILE, чтобы ИСПОЛЬЗОВАТЬ, как цикл DO-WHILE.
Примеры взяты здесь: http://blog.sqlauthority.com/2007/10/24/sql-server-simple-example-of-while-loop-with-continue-and-break-keywords/
-
Пример цикла WHILE
DECLARE @intFlag INT SET @intFlag = 1 WHILE (@intFlag <=5) BEGIN PRINT @intFlag SET @intFlag = @intFlag + 1 END GOResultSet:
1 2 3 4 5 -
Пример цикла WHILE с ключевым словом BREAK
DECLARE @intFlag INT SET @intFlag = 1 WHILE (@intFlag <=5) BEGIN PRINT @intFlag SET @intFlag = @intFlag + 1 IF @intFlag = 4 BREAK; END GOResultSet:
1 2 3 -
Пример цикла WHILE с ключевыми словами CONTINUE и BREAK
DECLARE @intFlag INT SET @intFlag = 1 WHILE (@intFlag <=5) BEGIN PRINT @intFlag SET @intFlag = @intFlag + 1 CONTINUE; IF @intFlag = 4 -- This will never executed BREAK; END GO
Но старайтесь избегать циклов на уровне базы данных. Ссылка .
Если вы не очень обиделись на ключевое слово GOTO , его можно использовать для имитации DO / WHILE в T-SQL. Рассмотрим следующий довольно бессмысленный пример, написанный в псевдокоде:
SET I=1 DO PRINT I SET I=I+1 WHILE I<=10Вот эквивалентный код T-SQL с использованием goto:
DECLARE @I INT=1; START: -- DO PRINT @I; SET @I+=1; IF @I<=10 GOTO START; -- WHILE @I<=10Обратите внимание на одно к одному сопоставление между решением GOTO и оригинальным псевдокодом DO / WHILE . Аналогичная реализация с использованием цикла WHILE будет выглядеть так:
DECLARE @I INT=1; WHILE (1=1) -- DO BEGIN PRINT @I; SET @I+=1; IF NOT (@I<=10) BREAK; -- WHILE @I<=10 ENDТеперь вы можете, конечно, переписать этот конкретный пример как простой цикл WHILE , так как это не такой хороший кандидат для конструкции DO / WHILE . Акцент был сделан на примере краткости, а не на применимости, поскольку законные случаи, требующие DO / WHILE встречаются редко.
REPEAT / UNTIL, кто-нибудь (не работает в T-SQL)?
SET I=1 REPEAT PRINT I SET I=I+1 UNTIL I>10Благодаря творческому использованию GOTO и логической инверсии с помощью ключевого слова NOT существует очень тесная связь между исходным псевдокодом и решением на основе GOTO . Аналогичное решение с использованием цикла WHILE выглядит так:
DECLARE @I INT=1; WHILE (1=1) -- REPEAT BEGIN PRINT @I; SET @I+=1; IF @I>10 BREAK; -- UNTIL @I>10 ENDМожно сделать аргумент, что для случая REPEAT / UNTIL решение на основе WHILE проще, поскольку условие if не инвертируется. С другой стороны, это также более многословно.
Если бы не все пренебрежительное отношение к использованию GOTO , они могли бы даже быть идиоматическими решениями для тех немногих раз, когда эти конкретные (злые) петлевые конструкции необходимы для кода T-SQL для ясности.
Используйте их по своему усмотрению, стараясь не терпеть ярость своих коллег-разработчиков, когда они поймают вас с помощью широкомасштабного GOTO .
Кажется, я вспоминаю эту статью не раз, и ответ близок к тому, что мне нужно.
Обычно, когда я думаю, что мне понадобится DO WHILE в T-SQL, это потому, что я повторяю курсор, и я ищу в значительной степени оптимальную ясность (по сравнению с оптимальной скоростью). В T-SQL, который, похоже, соответствует WHILE TRUE / IF BREAK .
Если это сценарий, который привел вас сюда, этот фрагмент может сэкономить вам время. В противном случае, добро пожаловать, я. Теперь я могу быть уверен, что я здесь уже не один раз. 🙂
DECLARE Id INT, @Title VARCHAR(50) DECLARE Iterator CURSOR FORWARD_ONLY FOR SELECT Id, Title FROM dbo.SourceTable OPEN Iterator WHILE 1=1 BEGIN FETCH NEXT FROM @InputTable INTO @Id, @Title IF @@FETCH_STATUS < 0 BREAK PRINT 'Do something with ' + @Title END CLOSE Iterator DEALLOCATE IteratorК сожалению, T-SQL, по-видимому, не предлагает более чистого способа одномерного определения операции цикла, чем этот бесконечный цикл.
Вы также можете использовать переменную выхода, если вы хотите, чтобы ваш код был более читаемым:
DECLARE @Flag int = 0 DECLARE @Done bit = 0 WHILE @Done = 0 BEGIN SET @Flag = @Flag + 1 PRINT @Flag IF @Flag >= 5 SET @Done = 1 ENDЭто, вероятно, будет более актуальным, если у вас будет более сложный цикл и попытайтесь отслеживать логику. Поскольку указанные петли дороги, поэтому попробуйте использовать другие методы, если сможете.
Только While Loop официально поддерживается SQL-сервером. Уже есть ответ для цикла DO while. Я подробно расскажу о способах достижения различных типов циклов на SQL-сервере.
Если вы знаете, вам нужно выполнить первую итерацию цикла в любом случае, тогда вы можете попробовать DO..WHILE или REPEAT..UNTIL версию SQL-сервера.
DO..WHILE Loop
DECLARE @X INT=1; WAY: --> Here the DO statement PRINT @X; SET @X += 1; IF @X<=10 GOTO WAY;REPEAT..UNTIL Loop
DECLARE @X INT = 1; WAY: -- Here the REPEAT statement PRINT @X; SET @X += 1; IFNOT(@X > 10) GOTO WAY;FOR Loop
DECLARE @cnt INT = 0; WHILE @cnt < 10 BEGIN PRINT 'Inside FOR LOOP'; SET @cnt = @cnt + 1; END; PRINT 'Done FOR LOOP';Справка
sqlserver.bilee.com
WHILE LOOP SQL Server | Oracle PL/SQL •MySQL •SQL Server
В этом учебном пособии вы узнаете, как использовать WHILE LOOP в SQL Server (Transact-SQL) с синтаксисом и примерами.
Описание
В SQL Server WHILE LOOP используется тогда, когда вы не уверены, сколько раз вы будет выполняться тело цикла, и тело цикла может не выполняться даже один раз.
Синтаксис
Синтаксис WHILE LOOP в SQL Server (Transact-SQL):
WHILE conditionBEGIN{… statements…}END;
Параметры или аргументы
condition – условие, которое проверяется при каждом прохождении через цикл. Если условие имеет значение TRUE, выполняется тело цикла. Если условие оценивается как FALSE, цикл завершается.statements — кода для выполнения при каждом прохождении через цикл.
Примечание
- Вы должны использовать инструкцию WHILE LOOP, если не знаете, сколько раз вы хотите, чтобы тело цикла выполнялось.
- Поскольку условие WHILE оценивается перед входом в цикл, возможно, что тело цикла может не выполняться даже один раз.
- См. также оператор BREAK для выхода из WHILE LOOP раньше.
- См. также оператор CONTINUE для перезапуска WHILE LOOP с самого начала.
Пример
Рассмотрим пример использования WHILE LOOP в SQL Server (Transact-SQL).Например:
DECLARE @site_id INT; SET @site_id = 0; WHILE @site_id <= 10 BEGIN PRINT 'Inside WHILE LOOP on yandex.com'; SET @site_id = @site_id + 1; END; PRINT 'Done WHILE LOOP on yandex.com'; GO
DECLARE @site_id INT; SET @site_id = 0;
WHILE @site_id <= 10 BEGIN PRINT 'Inside WHILE LOOP on yandex.com'; SET @site_id = @site_id + 1; END;
PRINT 'Done WHILE LOOP on yandex.com'; GO |
В этом примере WHILE LOOP цикл завершится, как только значение @site_id превысит 10, как указано в строке:
WHILE LOOP будет продолжаться в то время как @site_id @site_id будет > 10, цикл завершится.
Вы также можете использовать WHILE LOOP в курсоре.Например:
DECLARE contacts_cursor CURSOR FOR SELECT contact_id, site_id FROM contacts; OPEN contacts_cursor; FETCH NEXT FROM contacts_cursor; WHILE @@FETCH_STATUS = 0 BEGIN FETCH NEXT FROM contacts_cursor; PRINT 'Inside WHILE LOOP on Yandex.com'; END; PRINT 'Done WHILE LOOP on Yandex.com'; CLOSE contacts_cursor; DEALLOCATE contacts_cursor; GO
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
DECLARE contacts_cursor CURSOR FOR SELECT contact_id, site_id FROM contacts;
OPEN contacts_cursor; FETCH NEXT FROM contacts_cursor;
WHILE @@FETCH_STATUS = 0 BEGIN FETCH NEXT FROM contacts_cursor; PRINT 'Inside WHILE LOOP on Yandex.com'; END; PRINT 'Done WHILE LOOP on Yandex.com';
CLOSE contacts_cursor; DEALLOCATE contacts_cursor; GO |
В этом примере WHILE LOOP цикл прекращается, как только @@FETCH_STATUS больше не равен 0, как указано:
oracleplsql.ru
[do-while] Выполнять цикл while в SQL Server 2008 [while-loop] [loops]
Я не уверен в DO-WHILE IN MS SQL Server 2008, но вы можете изменить логику цикла WHILE, чтобы ИСПОЛЬЗОВАТЬ, как цикл DO-WHILE.
Пример цикла WHILE
DECLARE @intFlag INT SET @intFlag = 1 WHILE (@intFlag <=5) BEGIN PRINT @intFlag SET @intFlag = @intFlag + 1 END GOResultSet:
1 2 3 4 5Пример цикла WHILE с ключевым словом BREAK
DECLARE @intFlag INT SET @intFlag = 1 WHILE (@intFlag <=5) BEGIN PRINT @intFlag SET @intFlag = @intFlag + 1 IF @intFlag = 4 BREAK; END GOResultSet:
1 2 3Пример цикла WHILE с ключевыми словами CONTINUE и BREAK
DECLARE @intFlag INT SET @intFlag = 1 WHILE (@intFlag <=5) BEGIN PRINT @intFlag SET @intFlag = @intFlag + 1 CONTINUE; IF @intFlag = 4 -- This will never executed BREAK; END GOResultSet:
1 2 3 4 5
Но старайтесь избегать циклов на уровне базы данных. http://blog.sqlauthority.com/2007/10/24/sql-server-simple-example-of-while-loop-with-continue-and-break-keywords/ .
Кажется, я вспоминаю эту статью не раз, и ответ близок к тому, что мне нужно.
Обычно, когда я думаю, что мне понадобится DO WHILE в T-SQL, это потому, что я повторяю курсор, и я ищу в значительной степени оптимальную ясность (по сравнению с оптимальной скоростью). В T-SQL, который, похоже, соответствует WHILE TRUE / IF BREAK .
Если это сценарий, который привел вас сюда, этот фрагмент может сэкономить вам время. В противном случае, добро пожаловать, я. Теперь я могу быть уверен, что я здесь уже не один раз. :)
DECLARE Id INT, @Title VARCHAR(50) DECLARE Iterator CURSOR FORWARD_ONLY FOR SELECT Id, Title FROM dbo.SourceTable OPEN Iterator WHILE 1=1 BEGIN FETCH NEXT FROM @InputTable INTO @Id, @Title IF @@FETCH_STATUS < 0 BREAK PRINT 'Do something with ' + @Title END CLOSE Iterator DEALLOCATE IteratorК сожалению, T-SQL, по-видимому, не предлагает более чистого способа одномерного определения операции цикла, чем этот бесконечный цикл.
Только While Loop официально поддерживается SQL-сервером. Уже есть answer для цикла DO while. Я подробно расскажу о способах достижения различных типов циклов на SQL-сервере.
Если вы знаете, вам нужно выполнить первую итерацию цикла в любом случае, тогда вы можете попробовать DO..WHILE или REPEAT..UNTIL версию SQL-сервера.
DO..WHILE Loop
DECLARE @X INT=1; WAY: --> Here the DO statement PRINT @X; SET @X += 1; IF @X<=10 GOTO WAY;REPEAT..UNTIL Loop
DECLARE @X INT = 1; WAY: -- Here the REPEAT statement PRINT @X; SET @X += 1; IFNOT(@X > 10) GOTO WAY;FOR Loop
DECLARE @cnt INT = 0; WHILE @cnt < 10 BEGIN PRINT 'Inside FOR LOOP'; SET @cnt = @cnt + 1; END; PRINT 'Done FOR LOOP';Reference
code-examples.net
sql-server - Цикл SQL WHILE IF BREAK
В хранимой процедуре SQL Server 2012 у меня есть несколько вложенных структур. Я хочу вырваться из одного слоя из них.
Я думал, что описание BREAK в msdn https://msdn.microsoft.com/en-CA/library/ms181271.aspx было на моей стороне. Но я получаю какое-то странное поведение во время его запуска на одном шаге с помощью отладки. Я говорю странно, потому что это непротиворечиво. Иногда он ускользает от слоя, который я ожидаю. Иногда он пропускает пару.
WHILE ... BEGIN stuff1 IF...BEGIN stuff2 WHILE ... BEGIN stuff3 IF .... BEGIN stuff4 IF @NumberRecords=0 BREAK stuff5 END --stuff6 if @NumberRecords=0 and @loopBOMRowCount=@ResultsSOloopstart-1 break --on the last occasion I observed, @loopBOMRowCount was 6 and @ResultsSOloopstart 71 and it never highlighted this section, either way SET @loopBOMRowCount = @loopBOMRowCount + 1 END stuff7 --nothing actually here END --stuff8 SET @periodloopcount=@periodloopcount+1 --this is where it ended up highlighting on that last occasion END stuff9Итак, если NumberRecords = 0, то следующий op должен быть if if на stuff6, верно? Даже если stuff4 включает, скажем, таблицу INSERT INTO из вызова EXEC в хранимую процедуру? Ничто не должно путать стек из его слоев?
И да, я понимаю, что уродливый SQL. Большинство инструкций редактируются в двух временных таблицах, и я избегал передавать их туда и обратно в хранимые процедуры, которые иначе очищали бы код.
ИЗМЕНИТЬ
Мне удалось настроить маршрут так, как я хотел, добавив фиктивный цикл WHILE вокруг внутреннего IF, который я хочу вырваться из первого. Но мне очень хотелось бы знать, как я неверно истолковываю информацию msdn. Кажется, BREAK должен выйти из IF, если у него есть инструкция END.
Выходит самый внутренний цикл в инструкции WHILE или оператор IF... ELSE внутри цикла WHILE. Выполняются любые утверждения, появляющиеся после ключевого слова END, обозначающего конец цикла.
qaru.site
WHILE оператор MySQL | Oracle PL/SQL •MySQL •SQL Server
В этом учебном пособии вы узнаете, как использовать оператор WHILE (WHILE LOOP) в MySQL с синтаксисом и примерами.
Описание
В MySQL оператор WHILE используется тогда, когда вы не знаете, сколько раз будет выполняться тело цикла, и тело цикла может не выполняться даже один раз.
Синтаксис
Синтаксис инструкции WHILE в MySQL:
[ label_name: ] WHILE condition DO{…statements…}END WHILE [ label_name ];
Параметры или аргументы
label_name — необязательный. Это наименование связано с циклом WHILE.condition — условие которое проверяется при каждой итерации цикла WHILE. Если condition примет значение TRUE, тело цикла выполняется. Если условие принимает значение FALSE, цикл WHILE прекращается.statements — код, выполняемый при каждом, проходе через цикл WHILE.
Примечание
- Вы должны использовать оператор WHILE LOOP, если не знаете сколько раз должно выполняться тело цикла.
- Поскольку condition WHILE оценивается перед входом в цикл, то возможно, что тело цикла может не выполняться даже один раз.
Пример
Рассмотрим пример, показывающий как использовать оператор WHILE в MySQL:
DELIMITER // CREATE FUNCTION CalcCost ( starting_value INT ) RETURNS INT BEGIN DECLARE cost INT; SET cost = 0; label1: WHILE cost <= 3000 DO SET cost = cost + starting_value; END WHILE label1; RETURN cost; END; // DELIMITER ;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
DELIMITER //
CREATE FUNCTION CalcCost ( starting_value INT ) RETURNS INT
BEGIN
DECLARE cost INT;
SET cost = 0;
label1: WHILE cost <= 3000 DO SET cost = cost + starting_value; END WHILE label1;
RETURN cost;
END; //
DELIMITER ; |
В этом примере WHILE LOOP цикл будет прекращаться, как только cost превысит 3000, как указано:
label1: WHILE cost <= 3000 DO
label1: WHILE cost <= 3000 DO |
WHILE LOOP будет продолжаться с cost cost будет> 3000, цикл прекратится.
oracleplsql.ru
sql - как иметь двойной цикл while в sql server 2008
Я разрабатываю приложение для календаря встреч. Еще новичок здесь.
Мне нужна помощь в этой области.
Мне нужно иметь двойной цикл в столбцах (`calendarID, Slot, AppointmentDate ').
Столбец "слот" будет иметь значение 1,2,3,4,5,6,7,8 до 28 раз, в то время как календарьID будет непрерывно зацикливаться до значения 868. Дата назначения будет иметь значение с 1 августа 2012 года по 31 августа 2013 года (на самом деле я планирую сделать это в течение одного года)
ожидаемый результат
calendarID | Slot | AppointmentDate ---------------------------------------------- 1 | 1 | 1 Aug 2013 2 | 2 | 1 Aug 2013 3 | 3 | 1 Aug 2013 4 | 4 | 1 Aug 2013 5 | 5 | 1 Aug 2013 6 | 6 | 1 Aug 2013 7 | 7 | 1 Aug 2013 8 |..until 28 | 1 Aug 2013 9 | 1 | 2 Aug 2013 10 | 2 | 2 Aug 2013 11 | 3 | 2 Aug 2013 ...until 868 | n | n Month 2013Вот мой код, который я пытаюсь, кажется, что я очень далек от моего желаемого результата. Я отредактировал код, предоставленный Astrand
DECLARE @tblCalendar TABLE(CalendarEntryID INT, Slot INT, ADate Varchar(50)) DECLARE @x int, @y int , @d INT SET @X = 1 SET @y = 1 SET @d = 1 WHILE @X <= 868 BEGIN WHILE @Y <=28 AND @d <=31 AND @X <= 868 --LOOP FOR SLOT COLUMN BEGIN INSERT INTO @tblCalendar (CalendarEntryID,Slot, ADate) Values (@x, @y,@d +'/Aug/2013') SET @y = @y + 1 SET @x = @x + 1 SET @d = @d + 1 END SET @y = 1 END SELECT * FROM @tblCalendarизвините за трудность запроса и редактирования моего оригинального сообщения.
qaru.site