Sql server sql存储过程主体的末尾(它在哪里?)

Sql server sql存储过程主体的末尾(它在哪里?),sql-server,tsql,stored-procedures,Sql Server,Tsql,Stored Procedures,给出了以下语法和解释: { [ BEGIN ] sql_statement [;] [ ...n ] [ END ] } 一个或多个Transact-SQL语句,包括 程序您可以使用可选的开始和结束关键字来括起来 声明。有关信息,请参阅最佳实践,概述 备注,以及随后的限制和限制部分 本质上,这是一个SQL语句序列,如果没有BEGIN/END对,没有人知道它的结尾在哪里。开始/结束块本质上是一条语句。程序体是否可以由两个连续的开始/结束块组成?(很可能没有,但我看不到它写在任何地方。)当没有开始

给出了以下语法和解释:

{ [ BEGIN ] sql_statement [;] [ ...n ] [ END ] }
一个或多个Transact-SQL语句,包括 程序您可以使用可选的开始和结束关键字来括起来 声明。有关信息,请参阅最佳实践,概述 备注,以及随后的限制和限制部分

本质上,这是一个SQL语句序列,如果没有BEGIN/END对,没有人知道它的结尾在哪里。开始/结束块本质上是一条语句。程序体是否可以由两个连续的开始/结束块组成?(很可能没有,但我看不到它写在任何地方。)当没有开始/结束对时,解析器可以决定该过程在任何顶级SQL语句上结束。陷阱在哪里


备注和限制部分也没有多大帮助。

是的,两个
开始
/
结束
对可以构成单个存储过程的主体:

create procedure P
as
begin
    select 1 as A
end
begin
    select 2 as B
end
创建生成两个结果集的单个存储过程

存储过程的实际结束是批处理的结束。这是您发送到服务器的查询的整个主体,或者,如果您使用某些客户端工具(例如SSM),它将根据以下内容自动将其提交分为若干批:

向SQL Server实用程序发出一批Transact-SQL语句结束的信号

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

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


从逻辑上讲,这意味着
CREATE PROCEDURE
语句消耗了批处理的全部内容。

Hm,看起来我不能在一个批处理中发送多个
CREATE POC
语句,而不是从SSMS发送???例如,如果我使用的是ODBC?@Buran-one batch==一个存储过程,希望从我在中编辑的链接/引号中可以清楚地看到这一点。不过,这并不是直接相关的。我在想,我可以将所有数据库对象(无论什么)编写成一个大的SQL文件,然后从我的ODBC应用程序执行这个文件,以便在另一台服务器上重新创建所有内容。看来这根本不可能。是吗?@Buran-如果您在需要单独批次的每个项目之间包含
GO
s(最简单的方法是,在每个对象之间插入它们,而不管是否需要),那么这是可行的,然后您需要执行与客户端工具相同的工作-查找
GO
s,在此基础上将文本拆分为多个批次,并分别提交每个批次。不幸的是,这确实需要解析。我明白了。谢谢我对数据库还不熟悉,我希望您描述的技巧应该已经实现了(而且很久以前)。我只是不知道它们的存在。