Для выполнения повторяющихся операций в T-SQL применяются циклы. В частности, в T-SQL есть цикл WHILE. Этот цикл выполняет определенные действия, пока некоторое условие истинно.
1
2
| WHILE условие {инструкция| BEGIN ... END } |
Если в блоке WHILE необходимо разместить несколько инструкций, то все они помещаются в блок BEGIN...END.
Например, вычислим факториал числа:
1
2
3
4
5
6
7
8
9
10
11
| DECLARE @number INT , @factorial INT SET @factorial = 1; SET @number = 5; WHILE @number > 0 BEGIN SET @factorial = @factorial * @number SET @number = @number - 1 END ; PRINT @factorial |
То есть в данном случае пока переменная @number не будет равна 0, будет продолжаться цикл WHILE. Так как @number равна 5, то цикл сделает пять проходов. Каждый проход цикла называется итерацией. В каждой итерации будет переустанавливаться значение переменных @factorial и @number.
Другой пример - рассчитаем баланс счета через несколько лет с учетом процентной ставки:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| USE productsdb; CREATE TABLE #Accounts ( CreatedAt DATE , Balance MONEY) DECLARE @rate FLOAT , @period INT , @ sum MONEY, @ date DATE SET @ date = GETDATE() SET @rate = 0.065; SET @period = 5; SET @ sum = 10000; WHILE @period > 0 BEGIN INSERT INTO #Accounts VALUES (@ date , @ sum ) SET @period = @period - 1 SET @ date = DATEADD( year , 1, @ date ) SET @ sum = @ sum + @ sum * @rate END ; SELECT * FROM #Accounts |
Здесь создается временная таблица #Accounts, в которую добавляется в цикле пять строк с данными.
Операторы BREAK и CONTINUE
Оператор BREAK позволяет завершить цикл, а оператор CONTINUE - перейти к новой итерации.
1
2
3
4
5
6
7
8
9
10
11
12
13
| DECLARE @number INT SET @number = 1 WHILE @number < 10 BEGIN PRINT CONVERT (NVARCHAR, @number) SET @number = @number + 1 IF @number = 7 BREAK; IF @number = 4 CONTINUE ; PRINT 'Конец итерации' END ; |
Когда переменная @number станет равна 4, то с помощью оператора CONTINUE произойдет переход к новой итерации, поэтому последующая строка
PRINT 'Конец итерации'
не будет выполняться, хотя цикл продолжится.
Когда переменная @number станет равна 7, то оператор BREAK произведет выход из цикла, и он завершится.
Комментариев нет:
Отправить комментарий