使用变量标签的SQL GOTO语句

时间:2009-02-20 12:53:50

标签: sql sql-server goto

我希望能够做到这样的事情:

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

label_1:

label_2:

当然,sql server给了我一个不正确的语法错误...所以我想知道我是否仍然可以用稍微不同的语法来做到这一点?

6 个答案:

答案 0 :(得分:5)

我已经制定了可能对其他人有用的功能性黑客。在SQL Server 2008上,您无法动态构建goto,也无法在变量中提供标签。旧学校黑客是加载变量,跳转到单个点然后使用if语句来确定真实目的地。

GOTO当然是considered harmful,通常是一个坏主意。

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

答案 1 :(得分:2)

只有动态构建SQL语句才能执行此操作。

最好避免GOTO - 主要是为了代码可读性。

答案 2 :(得分:0)

为什么不简单地使用if / else?

答案 3 :(得分:0)

据我所知,你无法参数化GOTO。如果使用动态SQL,则可以执行此操作。

答案 4 :(得分:0)

显然不是一个及时的答案,但是当我最近发现自己想要这样做时,原因是因为我想多次执行相同的代码,然后返回正常流程,基本上" gosub&# 34;而不是"转到" ....

你可以做到。不是使用gosub,而是使用临时存储过程 - 创建临时存储过程create procedure #DRY然后调用它。你可以在完成后放弃它。

答案 5 :(得分:-2)

试试这个:

exec("goto "+@label)