SQL Serverでは、GOTO
を使用できます 実行の流れを変更します。これを使用して、T-SQLコードの別の部分に「ジャンプ」できます。
仕組みは、ラベルを作成してから、GOTO
を使用できるようにすることです。 そのラベルにジャンプします。 GOTO
の間のコード ラベルはスキップされ、ラベルで処理が続行されます。
GOTO
ステートメントとラベルは、プロシージャ、バッチ、またはステートメントブロック内のどこでも使用できます。ネストすることもできます。
例1-基本的な使用法
これがデモンストレーションの基本的な例です。
PRINT 1 PRINT 2 PRINT 3 GOTO Bookmark PRINT 4 PRINT 5 Bookmark: PRINT 6
結果:
1 2 3 6
例2–ラベルは一意である必要があります
各ラベルは、クエリバッチまたはストアドプロシージャ内で一意である必要があります。
同じラベルを複数回提供すると、次のようになります。
PRINT 1 PRINT 2 PRINT 3 GOTO Bookmark PRINT 4 Bookmark: PRINT 5 Bookmark: PRINT 6
結果:
Msg 132, Level 15, State 1, Line 8 The label 'Bookmark' has already been declared. Label names must be unique within a query batch or stored procedure.
例3–アウトオブバッチラベル
ラベルはGOTO
と同じバッチである必要があります 。現在のバッチ外のラベルに移動することはできません。
別のバッチでラベルに移動しようとする例を次に示します。
PRINT 1 PRINT 2 PRINT 3 GOTO Bookmark PRINT 4 GO PRINT 5 Bookmark: PRINT 6 GO
結果:
Msg 133, Level 15, State 1, Line 6 A GOTO statement references the label 'Bookmark' but the label has not been declared.
この場合、私はGO
を使用しました コードを2つのバッチに分割するコマンド。
例4–IFステートメントのGOTO
GOTO
を使用できます IF
で ステートメント。条件が真であるかどうかに応じて、特定のコードにジャンプします。
ここで@color
を設定します Red
への変数 そのため、コードはRed_Team
にジャンプします 。
DECLARE @color varchar(50) = 'Red'; IF @color = 'Red' GOTO Red_Team IF @color = 'Blue' GOTO Blue_Team ELSE GOTO Other_Team Red_Team: PRINT 'Red Team'; GOTO Finish_Line Blue_Team: PRINT 'Blue Team'; GOTO Finish_Line Other_Team: PRINT 'Other Team'; GOTO Finish_Line Finish_Line: PRINT 'Finished!';
結果:
Red Team Finished!
@color
を設定するとどうなりますか Blue
へ :
DECLARE @color varchar(50) = 'Blue'; IF @color = 'Red' GOTO Red_Team IF @color = 'Blue' GOTO Blue_Team ELSE GOTO Other_Team Red_Team: PRINT 'Red Team'; GOTO Finish_Line Blue_Team: PRINT 'Blue Team'; GOTO Finish_Line Other_Team: PRINT 'Other Team'; GOTO Finish_Line Finish_Line: PRINT 'Finished!';
結果:
Blue Team Finished!
完全を期すために、別の色を指定するとどうなりますか。
DECLARE @color varchar(50) = 'Orange'; IF @color = 'Red' GOTO Red_Team IF @color = 'Blue' GOTO Blue_Team ELSE GOTO Other_Team Red_Team: PRINT 'Red Team'; GOTO Finish_Line Blue_Team: PRINT 'Blue Team'; GOTO Finish_Line Other_Team: PRINT 'Other Team'; GOTO Finish_Line Finish_Line: PRINT 'Finished!';
結果:
Other Team Finished!
明らかにこれらは非常に単純な例ですが、GOTO
の基本的な概念を示しています。 。
例5–ラベルの位置
GOTO
分岐は、GOTO
の前または後に定義されたラベルに移動できます 。
GOTO
の前にラベルに移動する例を次に示します。 :
DECLARE @Counter int = 0; Loop: SET @Counter = @Counter + 1 IF @Counter < 10 PRINT @Counter ELSE GOTO Finish_Line GOTO Loop Finish_Line: PRINT 'Finished!'
結果:
1 2 3 4 5 6 7 8 9 Finished!
GOTO
の前にラベルを配置するときは、無限ループを開始しないように注意する必要があります。 けれど。
また、この例はデモンストレーションのみを目的としています。 WHILE
を使用しても同じ結果を得ることができます ループ:
DECLARE @Counter int = 1; WHILE @Counter < 10 BEGIN PRINT @Counter SET @Counter = @Counter + 1 END PRINT 'Finished!'
結果:
1 2 3 4 5 6 7 8 9 Finished!