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

时间:2014-06-09 19:07:48

标签: sql sql-server tsql stored-procedures

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

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

4 个答案:

答案 0 :(得分:4)

不,您应该使用RETURN结束您的程序。

 CREATE PROCEDURE uspGetAddress @City nvarchar(30)
 AS
   SELECT * 
   FROM AdventureWorks.Person.Address
   WHERE City = @City

 RETURN

GO实际上是指在sql脚本中分隔命令。

答案 1 :(得分:4)

声明goper the documentation

  

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

     

...

     

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

     

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

     

Transact-SQL语句不能与GO命令占用同一行。但是,行   可以包含评论。

     

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

存储过程定义per the documentation for 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

GO的值可在Sql Server Management Studio的选项中调整。如果您想使用jump而非go之类的内容,您可以(请记住,您几乎肯定会为此感到悲痛。)。< / p>

options screenshot

答案 2 :(得分:4)

只是想指出,如果在存储过程结束时没有GO,则在假定的过程体结束之后的任何T-SQL仍将包含在proc的主体中。

例如

CREATE PROCEDURE Foo
BEGIN
    SELECT * FROM dbo.Bar;
END

DROP TABLE dbo.Bar;

在此示例中,即使在EXEC dbo.Foo之后,运行END也会最终删除该表。为避免这种情况,您需要在GO之后放置END

答案 3 :(得分:2)

我更喜欢用beginend语句包围存储过程的主体:

CREATE PROCEDURE uspGetAddress (
    @City nvarchar(30)
) AS
BEGIN
    SELECT * 
    FROM AdventureWorks.Person.Address
    WHERE City = @City;
END;

GO不是T-SQL命令。运行脚本的工具可以理解它。正如documentation描述的那样:

  

GO不是Transact-SQL语句;这是一个被公认的命令   sqlcmd和osql实用程序以及SQL Server Management Studio代码   编辑器。

     

SQL Server实用程序将GO解释为应发送的信号   当前批处理的Transact-SQL语句到SQL的一个实例   服务器。当前批次的陈述由所有陈述组成   自上次GO开始,或自特别会议开始以来或   脚本,如果这是第一个GO。

顺便说一句,在您的情况下,用户定义的表函数可能比存储过程更合适。