SQL GOTO оператор с использованием переменной label - PullRequest
1 голос
/ 20 февраля 2009

Я надеялся, что смогу сделать что-то вроде этого:

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

label_1:

label_2:

конечно, сервер sql выдает мне неправильную синтаксическую ошибку ... поэтому мне было интересно, смогу ли я сделать это с немного другим синтаксисом?

Ответы [ 6 ]

5 голосов
/ 10 марта 2013

Я приготовил функциональный хак, который может оказаться полезным для других. В 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
2 голосов
/ 20 февраля 2009

Это можно сделать только в том случае, если вы динамически строите оператор SQL.

GOTO лучше избегать - в основном для удобства чтения кода.

0 голосов
/ 22 октября 2014

Очевидно, что это не своевременный ответ, но когда я недавно захотел это сделать, причина была в том, что я хотел выполнить один и тот же бит кода несколько раз, а затем вернуться к нормальному потоку, в основном «gosub», а не « Гото»....

И , которые вы можете сделать. Не с gosub, а с временной хранимой процедурой - создайте временную хранимую процедуру create procedure #DRY и затем вызовите ее. Вы можете бросить его, когда закончите.

0 голосов
/ 18 октября 2010

Насколько я знаю, вы не можете параметризовать GOTO. Вы можете сделать это, если используете динамический SQL.

0 голосов
/ 20 февраля 2009

попробуйте это:

exec("goto "+@label)
0 голосов
/ 20 февраля 2009

Почему бы просто не использовать if / else?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...