sql存储过程的正文结束(在哪里?)

时间:2017-01-23 08:38:34

标签: sql-server tsql stored-procedures

MSDN提供以下语法和解释:

{ [ BEGIN ] sql_statement [;] [ ...n ] [ END ] }
  

包含主体的一个或多个Transact-SQL语句   程序。您可以使用可选的BEGIN和END关键字进行封闭   声明。有关信息,请参阅最佳实践,常规   备注,以及后面的限制和限制部分。

本质上,这是一系列SQL语句,如果没有BEGIN / END对,则无人知道。 BEGIN / END块本质上是一个声明。程序体可以由两个连续的BEGIN / END块组成吗? (很可能没有,但我没有看到它写在任何地方。)当没有BEGIN / END对时,解析器可以决定该程序在任何顶级SQL语句上结束。渔获物在哪里?

备注和限制部分也不是很有帮助。

1 个答案:

答案 0 :(得分:3)

是的,两个BEGIN / END对可以组成一个存储过程的主体:

create procedure P
as
begin
    select 1 as A
end
begin
    select 2 as B
end

创建一个生成两个结果集的存储过程。

存储过程的实际结束是批次的结束。这是您发送到服务器的查询的整个主体,或者,如果您使用某些客户端工具(例如SSMS),它将根据GO command自动将其提交分批:

  

将一批Transact-SQL语句的结尾发送到SQL Server实用程序。

所有内容基于批处理的线索实际上是第一句话是您已链接到的Limitations and Restrictions部分:

  

CREATE PROCEDURE语句不能与单个批处理中的其他Transact-SQL语句组合使用。

从逻辑上讲,这意味着CREATE PROCEDURE语句会消耗批处理中的整个内容。