1

私はこのようなことができることを望んでいました:

declare @label varchar
set @label = 'label_1'
goto @label

label_1:

label_2:

もちろん、SQLサーバーは私に間違った構文エラーを与えます...それで私はまだ少し異なる構文でこれを行うことができるかどうか疑問に思いましたか?

4

6 に答える 6

5

他の人に役立つかもしれない機能的なハックを作成しました。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
于 2013-03-10T03:31:42.613 に答える
2

これは、SQL ステートメントを動的に作成する場合にのみ実行できます。

ただし、主にコードを読みやすくするために、GOTO は避けるのが最善です。

于 2009-02-20T13:15:24.170 に答える
0

私の知る限り、GOTOをパラメータ化することはできません。動的SQLを使用する場合は、これを行うことができます。

于 2010-10-18T14:45:47.670 に答える
0

単純にif/elseを使用しないのはなぜですか?

于 2009-02-20T12:57:30.187 に答える
0

明らかにタイムリーな回答ではありませんが、最近これをやりたいと思ったとき、その理由は、同じコードを複数回実行してから、基本的に「goto」ではなく「gosub」という通常の流れに戻りたかったからです。 ...

そしてあなたができること。gosub ではなく、一時ストアド プロシージャを使用します。一時ストアド プロシージャcreate procedure #DRYを作成してから呼び出します。終わったら捨てることができます。

于 2014-10-22T02:23:36.940 に答える
-2

これを試して:

exec("goto "+@label)
于 2009-02-20T13:15:22.407 に答える