我们应该使用GO语句结束存储过程吗?

Ome*_*r K 6 sql t-sql sql-server stored-procedures

我们应该用GO语句结束存储过程,如果是这样,使用GO有什么好处?

CREATE PROCEDURE uspGetAddress @City nvarchar(30)
AS
SELECT * 
FROM AdventureWorks.Person.Address
WHERE City = @City
GO
Run Code Online (Sandbox Code Playgroud)

Nic*_*rey 5

该声明go每个文档

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

...

GO不是Transact-SQL语句;它是sqlcmd和osql实用程序以及SQL Server Management Studio代码编辑器可以识别的命令。

SQL Server实用程序解释GO为一种信号,它们应将当前批Transact-SQL语句发送到SQL Server实例。当前这批语句由自上次GO或自临时会话或脚本(如果是第一个)开始以来输入的所有语句组成GO

Transact-SQL语句不能与GO命令占据同一行。但是,该行可以包含注释。

用户必须遵循批处理规则。例如,在批处理中的第一条语句之后对存储过程的任何执行都必须包含EXECUTE关键字。局部(用户定义)变量的范围仅限于批处理,并且在GO命令后无法引用 。

根据的文档create procedure,存储过程定义带有限制。它必须是批处理中的第一个(也是唯一的)语句:

CREATE PROCEDURE语句不能与其他Transact-SQL语句合并在一个批处理中。

这意味着存储过程的主体以批处理结尾。GO在源文件中添加是一个好习惯。特别是因为通常在创建存储过程之前和之后执行操作。您会经常看到类似于以下内容的源文件:

if (object_id('dbo.foobar') is not null ) drop procedure dbo.foobar
GO
-- dbo.foobar --------------------------------------------
-- 
-- This stored procedure does amazing and wonderful things
----------------------------------------------------------
create procedure dbo.foobar
as

   ...
   {a sequence of amazing and wonderful SQL statements}
   ...
   return 0
GO

grant execute on dbo.foobar to some_schema
GO
Run Code Online (Sandbox Code Playgroud)

的值可以GO在Sql Server Management Studio的选项中调整。如果您想使用jump而不是go,可以使用(记住,您几乎肯定会为此感到悲伤)。

选项屏幕截图