为什么Transact-SQL语句不能在同一批次中组合在一起?

时间:2016-05-04 05:52:44

标签: sql-server tsql technet

TechNet的BEGIN ... END描述让我对以下评论感到困惑:

尽管所有Transact-SQL语句在BEGIN ... END块中都有效,但某些Transact-SQL语句不应在同一批次(语句块)中组合在一起。

https://technet.microsoft.com/en-us/library/aa225998(v=sql.80).aspx

有人可以告诉我为什么不应该将它们分组到BEGIN ... END块中吗?当我使用BEGIN ... END来创建区域作为此建议时是否有任何问题:sql server #region

3 个答案:

答案 0 :(得分:1)

为了能够折叠某个区域,

BEGIN..END 不是可视选项,您实际上是在告诉服务器这些线路在一起。将它用作#region就像解决方法

这是因为BEGIN和END之间的任何内容将作为批处理执行,并且批处理的所有规则都将适用于它。

想想当其中一个语句发生错误时会发生什么,你想让其他语句继续吗?

点击此处查看更多信息:Batches

答案 1 :(得分:1)

如果需要在T-SQL脚本中创建多个批处理,则需要使用GO语句显式分隔命令组。所以BEGIN ... END块(批处理)是隐式创建的,即使你没有明确地将它添加到你的代码中。所以明确地添加它不会给你带来任何额外的麻烦。

某些命令无法按照linked MSDN article:

中的规定在一个批次中组合在一起
  

创建默认,创建功能,创建程序,创建规则,创建   TRIGGER和CREATE VIEW语句不能与其他语句结合使用   批量陈述。 CREATE语句必须开始批处理。所有   该批次中的其他声明将被解释为部分   第一个CREATE语句的定义。

     

无法更改表,然后在中引用新列   同一批。

     

如果EXECUTE语句是批处理中的第一个语句,则执行EXECUTE   关键字不是必需的。如果是,则需要EXECUTE关键字   EXECUTE语句不是批处理中的第一个语句。

答案 2 :(得分:0)

您可以使用注释来区分不同的批次,如下所示。

BEGIN /** Region1 Starts**/
....
....
....
END /** Region1 ends**/

BEGIN /** Region2 Starts **/
....
....
....
END /** Region2 Ends **/