SQL Server中存储过程中;
和GO
之间有什么区别?
实际上,如果我在SQL服务器中有一个存储过程,并且想要在其中放置单独的查询,其中第一个只计算记录数(计数)而第二个根据某些条件选择一些记录,那么应该是什么我在两个查询之间使用?
Go
或;
答案 0 :(得分:21)
;
刚刚结束声明。
GO不是声明,而是服务器将当前批次提交到数据库的命令。它在交易中创建一个止损。
http://msdn.microsoft.com/en-us/library/ms188037.aspx
(更新,感谢评论):
据我所知,GO是针对管理工作室的声明,也可能是其他工具。
答案 1 :(得分:12)
分号分隔查询,GO命令分隔批次。 (GO也不是T-SQL命令,它是sqlcmd和osql实用程序以及Management Studio识别的命令。)
您不能在存储过程中使用GO。如果您尝试,程序的定义将在那里结束,其余的将是一个单独的批次。
局部变量具有批处理的范围,因此在GO命令之后,您不能使用在GO命令之前声明的局部变量:
declare @test int
set @test = 42
GO
select @Test -- causes an error message as @Test is undefined
答案 2 :(得分:4)
GO不是服务器的命令,它是MS提供的大多数客户端工具的默认批处理分隔符。当客户端工具单独在新行上遇到“GO”时,它会将迄今为止累积的任何命令发送到服务器,然后重新开始。
这意味着在一个批次中声明的任何变量在后续批次中都不可用。这也意味着不能在“GO”命令周围放置多行注释 - 因为服务器将看到第一批,并看到未终止的注释。
答案 3 :(得分:2)
它标志着查询分析器和批处理中批处理的结束 因此,表示该批次中存储过程定义的结束。 尽管我知道它不是sp的一部分。 GO不是TSQL命令。
并且;刚刚结束声明。
答案 4 :(得分:1)
我知道此线程很旧,但我认为这些其他用途/差异可能对像我这样的关于GO
的其他搜索非常方便。
GO
之后的所有内容都不会在您的程序中显示,因为CREATE/ALTER PROCEDURE
将执行SELECT 1 As X
命令。例如,如果您运行此...
创建步骤X AS 选择1作为X 走 选择2作为X
然后,在运行它之后,您要编辑该过程,您会发现只有GO
在其中,因为GO
创建了该存储过程,并假定了之后的所有操作。您正在做而不是存储过程的一部分。
将GO
视为告诉SSMS将其上方的所有内容发送到服务器以执行的一种方式。服务器永远不会收到BEGIN TRANSACTION
,因为它只是用来标记要SSMS发送到服务器的一批命令的结尾。
如果您需要控制存储过程中的执行流程,则可以使用COMMIT TRANSACTION
和xs
来实现,而存储过程中允许使用这些操作。