我们是否应该使用GO语句结束存储过程,如果是这样,使用GO有什么好处?
CREATE PROCEDURE uspGetAddress @City nvarchar(30)
AS
SELECT *
FROM AdventureWorks.Person.Address
WHERE City = @City
GO
答案 0 :(得分:4)
不,您应该使用RETURN
结束您的程序。
CREATE PROCEDURE uspGetAddress @City nvarchar(30)
AS
SELECT *
FROM AdventureWorks.Person.Address
WHERE City = @City
RETURN
GO
实际上是指在sql脚本中分隔命令。
答案 1 :(得分:4)
将一批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>
答案 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)
我更喜欢用begin
和end
语句包围存储过程的主体:
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。
顺便说一句,在您的情况下,用户定义的表函数可能比存储过程更合适。