有什么区别;和SQL在SQL Server中的存储过程?

时间:2010-02-22 11:11:12

标签: sql-server stored-procedures

SQL Server中存储过程中;GO之间有什么区别?

实际上,如果我在SQL服务器中有一个存储过程,并且想要在其中放置单独的查询,其中第一个只计算记录数(计数)而第二个根据某些条件选择一些记录,那么应该是什么我在两个查询之间使用?

Go;

5 个答案:

答案 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的其他搜索非常方便。

  1. GO之后的所有内容都不会在您的程序中显示,因为CREATE/ALTER PROCEDURE将执行SELECT 1 As X命令。例如,如果您运行此...

    创建步骤X AS 选择1作为X 走 选择2作为X

然后,在运行它之后,您要编辑该过程,您会发现只有GO在其中,因为GO创建了该存储过程,并假定了之后的所有操作。您正在做而不是存储过程的一部分。

  1. 我很惊讶我没有看到太多提及,但是批处理分隔符不仅特定于您要查询的程序,而且对于SSMS,它实际上是用户可编辑的!如果进入设置并将批处理分隔符从GO更改为XX,则在我的SSMS副本中,XX执行的批处理不是GO。那么,如果我尝试执行包含GO的存储过程会发生什么?

GO视为告诉SSMS将其上方的所有内容发送到服务器以执行的一种方式。服务器永远不会收到BEGIN TRANSACTION,因为它只是用来标记要SSMS发送到服务器的一批命令的结尾。 如果您需要控制存储过程中的执行流程,则可以使用COMMIT TRANSACTIONxs来实现,而存储过程中允许使用这些操作。