ストアドプロシージャでのWHILEステートメントの使用
この記事を読んだ後、WHILEステートメントを使用してストアドプロシージャ内にループを記述する
このレッスンのすべての例は、Microsoft SQL Server Management StudioおよびサンプルデータベースAdventureWorksおよびWideWorldImportersに基づいています。 あなたは私のガイドSQL Serverの使用を開始すると、これらの無料のツールを使用して開始することができます。WHILE、BREAK、およびCONTINUE
WHILE文は、SQL文のブロックを繰り返し実行するために使用されます。 WHILEステートメントの条件がtrueの場合、ブロックは繰り返し実行されます。
WHILE文の一般的な形式は次のとおりです。
WHILE conditionBEGIN -- code block run when condition is TRUEEND
繰り返し文、特にパターンに分類される文を見つけた場合、WHILE文を使用して入力を保存し、プログたとえば、各週の開始日を含む一時テーブルを作成する必要があるとしましょう。 もちろん、私たちは52個の個々のINSERT文を書くことができますが、それは退屈です!代わりにWHILEコマンドを使用して52週をループし、毎週の開始日をテーブルに挿入します。 次の例でこれを行う方法を見ることができます。
--Setup VariablesDECLARE @myTable TABLE(WeekNumber int, DateStarting smalldatetime)DECLARE @n int = 0DECLARE @firstWeek smalldatetime = '12/31/2017'--Loop Through weeksWHILE @n <= 52BEGIN INSERT INTO @myTable VALUES (@n, DATEADD(wk,@n,@firstWeek)); SELECT @n = @n + 1END--Show ResultsSELECT WeekNumber, DateStartingFROM @myTable
このティックを作るのはDATEADD関数です。 DATEADD(wk,@n,@firstWeek)は、@firstWeek日付に週の日数を追加することに注意してください。 最初の反復では、0週間が追加されます。 2回目の反復では、@n=1なので、1週間が加算されます。
さらにいくつかの点があります。
- WHILEステートメントは変数@nをテストします。 それが<=52の場合、プログラムブロック(緑)を実行できます。
- ブロックが実行されるたびに、変数@nが1ずつ増加します。 これは重要です。 これが起こらなかった場合、値は52より大きくなることはなく、プログラムはコードブロックをonとonで実行し、endなしで実行します。 これは無限ループと呼ばれます。
- 上記の#2に強化! ループに終了条件があることが重要です。 私たちの場合、変数@nが増分され、最終的には52より大きくなることを確認します。
- 日付値を「駆動」するために値@nを使用します。 基準日@firstWeekに週を追加することで、後続の開始週の日付を計算できます。
結果は次のとおりです。
この単純なループからわかるように、興味深いデータを作成することができ、文を”ハードコード”するよりも、日付関数を使用してwoを行う方が楽しかったです。 ループを使用することは非常に強力です。
Breakを使用してループを短絡する
BREAK文は、WHILE文のコードブロックから強制的に終了するために使用されます。
次の例では、WHILEステートメントを変更しました。 現在では、緑色で着色されたBREAK文を使用しています。
二つの変更があります。
- WHILEステートメントの条件は、@nが常にゼロ以上であるため、常にTRUEと評価されます。
- IF文は終了条件をテストし、TRUEの場合はBREAKを実行します。
DECLARE @myTable TABLE(WeekNumber int, DateStarting smalldatetime)DECLARE @n int = 0DECLARE @firstWeek smalldatetime = '12/31/2017'WHILE @n > -1BEGIN INSERT INTO @myTable VALUES (@n, DATEADD(wk,@n,@firstWeek)); SELECT @n = @n + 1 IF @n > 52 BREAKEND
BREAKステートメントは、実行を終了するのに便利です。 WHILE文がネストされている場合は、内部のmostループが終了します。
CONTINUEを使用してループをリセットする
CONTINUEステートメントは、WHILEステートメントのコードブロックを再起動します。 CONTINUEの後に見つかったステートメントは実行されません。
たとえば、次の例では、PRINTステートメントは実行されません。
DECLARE @myTable TABLE(WeekNumber int, DateStarting smalldatetime)DECLARE @n int = 0DECLARE @firstWeek smalldatetime = '12/31/2017'WHILE @n > -1BEGIN INSERT INTO @myTable VALUES (@n, DATEADD(wk,@n,@firstWeek)); SELECT @n = @n + 1 IF @n > 52 BREAK ELSE CONTINUE PRINT ‘I Never get executed’END
その理由は、BREAK文が強制的に終了するか、CONTINUEが実行されると、ループがブロックの先頭にリセットされるためです。