ストアドプロシージャでの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に週を追加することで、後続の開始週の日付を計算できます。

結果は次のとおりです。

WHILE文の例の結果

この単純なループからわかるように、興味深いデータを作成することができ、文を”ハードコード”するよりも、日付関数を使用してwoを行う方が楽しかったです。 ループを使用することは非常に強力です。

Breakを使用してループを短絡する

BREAK文は、WHILE文のコードブロックから強制的に終了するために使用されます。

次の例では、WHILEステートメントを変更しました。 現在では、緑色で着色されたBREAK文を使用しています。

二つの変更があります。

  1. WHILEステートメントの条件は、@nが常にゼロ以上であるため、常にTRUEと評価されます。
  2. 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が実行されると、ループがブロックの先頭にリセットされるためです。



コメントを残す

メールアドレスが公開されることはありません。