【问题标题】:Begin...End blocks in SQL Server: Is this code right?SQL Server 中的 Begin...End 块:这段代码对吗?
【发布时间】:2009-02-03 15:54:08
【问题描述】:

我只是想确认我没有遗漏任何东西......所以请耐心等待。

我正在重写很多旧的存储过程,并且不断看到格式类似于此的 IF 语句:

begin
    if @someParameter <> 'ThisType'
    set @someCode = right(cast(@pYear as varchar(6)),2) + 'THIS'
end

所以 Begin...End 块只是包装(但不影响)IF 语句,对吗?这是 IF 的一些旧语法吗?

写这篇文章的人在这份工作之前没有太多的 SQL 经验;他主要在 VB (pre-.NET) 中工作。也许这是其他语言的语法,所以他不小心(习惯性地)这样写?

这是 SQL Server 2005(代码是为 SQL Server 2000 编写的),顺便说一句

就像我说的那样,我只是想把我的大脑包裹在这个意大利面上。欢迎任何想法/cmets/启发性见解

谢谢

【问题讨论】:

  • 我仍然对如何/为什么以这种方式编写代码感到困惑。猜猜他最初只是误解了语法,然后继续这样做。这很有趣......我似乎记得那个人警告我复杂的 IF 语句在 T-SQL 中是不稳定的。你能猜到他为什么会遇到麻烦吗? :)

标签: sql-server syntax


【解决方案1】:

在 T-SQL 中,Begin 和 END 应该将包含的 IF(或其他控制结构)语句与正在执行的多个语句(如代码块)包装起来

会工作

if @someParameter <> 'ThisType'
    set @someCode = right(cast(@pYear as varchar(6)),2) + 'THIS'

也可以,但不是绝对必要的

if @someParameter <> 'ThisType'
Begin
    set @someCode = right(cast(@pYear as varchar(6)),2) + 'THIS'
End

会按预期工作

if @someParameter <> 'ThisType'
Begin
    set @someCode = right(cast(@pYear as varchar(6)),2) + 'THIS'
    {...do other stuff}
End

不会按预期工作(如果您希望这两个语句仅在 IF 条件为 me 时执行)

if @someParameter <> 'ThisType'
    set @someCode = right(cast(@pYear as varchar(6)),2) + 'THIS'
    {...do other stuff}

没有语义价值

Begin --without wrapping control structure
    {...stuff}
End 

【讨论】:

    【解决方案2】:

    正确。您示例中的 begin...end 块封装了 IF 语句,但不影响它。尽管有罪的程序员可能应该这样做

    BEGIN
      if ... BEGIN
        set @somecode...
      END
    END 
    

    【讨论】:

      【解决方案3】:

      您可以放心地将其更改为:

      if @someParameter <> 'ThisType'
      begin
          set @someCode = right(cast(@pYear as varchar(6)),2) + 'THIS'
      end
      

      begin..end 仍然是多余的,但代码更具可读性。

      【讨论】:

        【解决方案4】:

        这取决于之前的情况。您发布的代码与

        相同
        if @someParameter <> 'ThisType'
        set @someCode = right(cast(@pYear as varchar(6)),2) + 'THIS'
        

        在 if 之前可能有一个需要开始/结束块的语句。

        【讨论】:

        • 好主意,但在 BEGIN 之前没有什么相关的。这是一个谨慎的块
        • 哎呀...让它“离散”
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多