了解 T-SQL GOTO

Posted

技术标签:

【中文标题】了解 T-SQL GOTO【英文标题】:Understanding T-SQL GOTO 【发布时间】:2015-12-24 13:57:08 【问题描述】:

我的老师最近谈到了要在 Management Studio 中使用的语句“GOTO”,但一开始我不太明白。他表示,借助我可以自己命名的标签,GOTO 被用来跳转到不同的代码段。这是他用来代表他的例子的代码:

select 'first'

goto jump
select 'second'

jump:
select 'third'

当我执行代码时,果然打印出“第一”和“第三”。我现在的问题是,选择的“第二个”首先在那里做什么?

【问题讨论】:

GOTO 是一种控制查询流程的方法。在实际使用中,GOTO 需要满足一个条件(例如:IF SomeCol = 'SomeValue' GOTO jump)。在提供的示例中,SELECT 'second' 的唯一用途是说明当您使用GOTO 时,会跳过该代码。 至于为什么它首先存在,这是一个不好的例子。一个更好的例子是:msdn.microsoft.com/en-us/library/ms180188.aspx 在这种情况下,不是在 if 中嵌入代码,而是使用 goto 来调用代码。如果多个 if 语句可以调用相同的 goto,这具有重构代码以提高可读性的优势;少复制/粘贴。然而,大多数人会用必要的代码创建一个函数/过程并调用它;这就是为什么 GoTo 不是一个受欢迎的选择。 【参考方案1】:

在您的示例中,第二个select 显然是不必要的。

GOTO 是程序代码的“控制流”示例。它是最早的计算机语言的构造,在处理诸如 C 或汇编代码之类的语言时直接映射到硬件的工作方式。从那时起,它已被包含在许多其他语言中。

GOTO 经常与IF 一起使用。但是,T-SQL 提供了更好的控制流功能,例如:

同时 如果/开始 尝试/捕捉

一般来说,您应该使用这些构造而不是GOTO。事实上,GOTO 颇有争议。很多人认为它总是代码糟糕的标志(“意大利面条代码”有时用于描述这种类型的代码)。其他人会为异常处理(我有时会这样做)或某些类型的状态机之类的东西创建一个非常罕见的异常。

在我看来,GOTO 应该只在所有其他构造之后才被教授,并且只能用于非常特定的目的。

【讨论】:

以上是关于了解 T-SQL GOTO的主要内容,如果未能解决你的问题,请参考以下文章

GOTO :EOF 返回到哪里?

JAVA中有没有Goto?

T-SQL查询进阶--SQL Server中的事务与锁

SQLServer数据库基础--E-R图三大范式数据库设计步骤

T-SQL:没有聚合的数据透视表

通过goto语句学习if...elseswitch语句并简单优化