1

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

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

label_1:

label_2:

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

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

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

你可以做到这一点不是使用 gosub,而是使用临时存储过程——创建一个临时存储过程create procedure #DRY,然后调用它。完成后可以放下它。

于 2014-10-22T02:23:36.940 回答
0

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

于 2009-02-20T12:57:30.187 回答
0

据我所知,您无法参数化 GOTO。如果您使用动态 SQL,则可以这样做。

于 2010-10-18T14:45:47.670 回答
-2

尝试这个:

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