开始... SQL Server中的结束块:这个代码是对的吗?

时间:2009-02-03 15:54:09

标签: sql-server syntax

我只是想证实我在这里没有遗漏某些东西......所以请耐心等待。

我正在重写很多旧的存储过程,并且看到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编写的),btw

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

由于

4 个答案:

答案 0 :(得分:10)

在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条件为我时执行)

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

没有语义价值

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

答案 1 :(得分:3)

正确。示例中的begin ... end块封装了IF语句,但不会影响它。虽然有罪的程序员可能应该已经完成​​了

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

答案 2 :(得分:1)

您可以安全地将其更改为:

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

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

答案 3 :(得分:1)

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

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

在if之前可能有一个声明需要一个开始/结束块。