【问题标题】:In what case would the use of a T-SQL GOTO statement be acceptable?在什么情况下可以接受使用 T-SQL GOTO 语句?
【发布时间】:2013-07-26 12:55:28
【问题描述】:

在一次关于 Microsoft T-SQL 代码格式的“宗教”讨论中,我质疑 GOTO 语句在 T-SQL 语法中是否仍然可用。在使用 T-SQL 的 13 年中,我从未有机会使用它,而且确实不知道它是否存在。在对文档进行了简短搜索后,令我惊愕的是,它确实存在!

我的问题是这样的:

是否存在至少一种情况,其中 GOTO 语句产生的解决方案性能优于使用其他高阶编程结构的解决方案?

  • 加密算法实现

我的问题是不是

  • 如何在不创建整个函数的情况下使用少量功能?
  • 如何在不复制/粘贴的情况下复制错误处理功能?

【问题讨论】:

  • 我曾经解决过一个需要 goto 的问题:stackoverflow.com/questions/7244617/…
  • @t-clausen.dk 这绝对需要被列为答案!这肯定是 GOTO 的一个有趣且独特的用法!关于您为什么不使用 while 循环的任何想法?
  • 这也可以用WHILE :) 完成

标签: sql tsql coding-style goto


【解决方案1】:

我几乎从不使用GOTO,没有它也能轻松生活。

我会考虑使用它的一种情况是当我有复杂的代码进行大量错误检查时。当错误返回时,我可能想采取一些措施,GOTO 允许我为错误检查定义单个代码块。

您可以通过多种方式解决此问题,但GOTO 是一个合理的选择,可以保证一致地处理错误并且代码不会被大量if @Error = 0 . . . 语句弄乱。

【讨论】:

  • 我假设您在这里指的是灾难性错误处理,例如 5 个可能失败的语句,如果其中任何一个语句失败,只需使用单个错误处理块。
  • 现在看来,这种情况在 SQL Server 的较新迭代中可用的 try-catch 语义基本上是可以避免的。 @Gordon Linoff,你比较过这两种方法吗?
  • @NormanH 。 . . try/catch 块不替换 GOTO 和错误处理。错误处理代码本质上是存储过程的“退出”代码,例如在发现错误时记录错误。 try/catch 块捕获错误(并且可能会处理它,但常见错误处理代码的重点是避免一遍又一遍地重复相同的代码)。
【解决方案2】:

我在大型脚本中看到过几次 goto,人们使用它来提高可读性。有时它的可读性更好,但大多数情况下它会变成意大利面条代码。

我只看到 goto 可能表现更好的一种情况。它在多个while循环中。您可以使用 goto 一次而不是多个 breaks ,后者仅存在于最内层循环中。尽管如此,在我看来,break 并不比 goto 好多少,这两者都不是一种好的编程风格。

while ...
  while ...
    while... 
    break
  break
break


while ...
  while ...
    while... 
    goto endloops

endloops:

【讨论】:

  • 这是一个很好的答案和独特的方法。当然,防范意大利面条式代码是一项挑战 - 但即使充分利用函数也可能发生这种情况!
【解决方案3】:

我主要在 SSIS 不可用时使用 GOTO 语句(不要问!!)为用于 ETL 处理的大型存储过程提供一些控制流。这是我唯一一次使用它们,虽然在那种情况下很有用,但显然不是你会遇到的情况。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-28
    • 1970-01-01
    • 2017-11-30
    • 1970-01-01
    • 1970-01-01
    • 2011-08-11
    • 1970-01-01
    • 2013-03-30
    相关资源
    最近更新 更多