私はこのようなことができることを望んでいました:
declare @label varchar
set @label = 'label_1'
goto @label
label_1:
label_2:
もちろん、SQLサーバーは私に間違った構文エラーを与えます...それで私はまだ少し異なる構文でこれを行うことができるかどうか疑問に思いましたか?
私はこのようなことができることを望んでいました:
declare @label varchar
set @label = 'label_1'
goto @label
label_1:
label_2:
もちろん、SQLサーバーは私に間違った構文エラーを与えます...それで私はまだ少し異なる構文でこれを行うことができるかどうか疑問に思いましたか?
他の人に役立つかもしれない機能的なハックを作成しました。SQL Server 2008 では、goto を動的に作成することも、変数にラベルを指定することもできません。古い学校のハックは、変数をロードし、単一のポイントにジャンプしてから、if ステートメントを使用して実際の宛先を決定することです。
もちろん、GOTO は有害であると考えられており、一般的には悪い考えです。
l1:
print '1'
l2:
print '2'
goto l4
l3:
print '3' -- should not print
l4:
print '4'
declare @lbl nvarchar(5)
set @lbl = N'l6'
goto vjump
-- goto @lbl -- doesn't work
-- exec('goto ' + @lbl) -- doesn't work
l5:
print '5'
l6:
print '6'
l7:
print '7'
return
vjump:
if @lbl = 'l1'
goto l1
if @lbl = 'l2'
goto l2
if @lbl = 'l3'
goto l3
if @lbl = 'l6'
goto l6
これにより、
1
2
4
6
7
これは、SQL ステートメントを動的に作成する場合にのみ実行できます。
ただし、主にコードを読みやすくするために、GOTO は避けるのが最善です。
私の知る限り、GOTOをパラメータ化することはできません。動的SQLを使用する場合は、これを行うことができます。
単純にif/elseを使用しないのはなぜですか?
明らかにタイムリーな回答ではありませんが、最近これをやりたいと思ったとき、その理由は、同じコードを複数回実行してから、基本的に「goto」ではなく「gosub」という通常の流れに戻りたかったからです。 ...
そして、あなたができること。gosub ではなく、一時ストアド プロシージャを使用します。一時ストアド プロシージャcreate procedure #DRY
を作成してから呼び出します。終わったら捨てることができます。
これを試して:
exec("goto "+@label)