[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/

  1. Пример цикла WHILE

    DECLARE @intFlag INT SET @intFlag = 1 WHILE (@intFlag <=5) BEGIN PRINT @intFlag SET @intFlag = @intFlag + 1 END GO

    ResultSet:

    1 2 3 4 5
  2. Пример цикла WHILE с ключевым словом BREAK

    DECLARE @intFlag INT SET @intFlag = 1 WHILE (@intFlag <=5) BEGIN PRINT @intFlag SET @intFlag = @intFlag + 1 IF @intFlag = 4 BREAK; END GO

    ResultSet:

    1 2 3
  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

    ResultSet:

    1 2 3 4 5

Но старайтесь избегать циклов на уровне базы данных. Ссылка .

Если вы не очень обиделись на ключевое слово 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 в 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 .

Кажется, я вспоминаю эту статью не раз, и ответ близок к тому, что мне нужно.

Обычно, когда я думаю, что мне понадобится 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.

Примеры взяты здесь: http://blog.sqlauthority.com/2007/10/24/sql-server-simple-example-of-while-loop-with-continue-and-break-keywords/

  1. Пример цикла WHILE

    DECLARE @intFlag INT SET @intFlag = 1 WHILE (@intFlag <=5) BEGIN PRINT @intFlag SET @intFlag = @intFlag + 1 END GO

    ResultSet:

    1 2 3 4 5
  2. Пример цикла WHILE с ключевым словом BREAK

    DECLARE @intFlag INT SET @intFlag = 1 WHILE (@intFlag <=5) BEGIN PRINT @intFlag SET @intFlag = @intFlag + 1 IF @intFlag = 4 BREAK; END GO

    ResultSet:

    1 2 3
  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

    ResultSet:

    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