【发布时间】:2010-02-22 11:11:12
【问题描述】:
SQL Server 存储过程中; 和GO 有什么区别?
实际上,如果我在 SQL Server 中有一个存储过程,并且想在其中放置 t 个单独的查询,第一个查询只计算记录数(计数),第二个查询根据某些条件选择一些记录,那么应该我在这两个查询之间使用?
Go 或 ;
【问题讨论】:
标签: sql-server stored-procedures
SQL Server 存储过程中; 和GO 有什么区别?
实际上,如果我在 SQL Server 中有一个存储过程,并且想在其中放置 t 个单独的查询,第一个查询只计算记录数(计数),第二个查询根据某些条件选择一些记录,那么应该我在这两个查询之间使用?
Go 或 ;
【问题讨论】:
标签: sql-server stored-procedures
; 只是结束语句。
GO 不是一个语句,而是一个命令服务器将当前批次提交到数据库。它会在交易中创建一个止损点。
http://msdn.microsoft.com/en-us/library/ms188037.aspx
(更新,感谢 cmets):
据我所知,GO 是针对管理工作室的声明,可能也适用于其他工具。
【讨论】:
GO的语句,它会抛出异常。
分号分隔查询,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
【讨论】:
我知道这个帖子很旧,但我认为这些其他用途/差异对于像我这样的其他关于 GO 的搜索可能会很方便。
GO 之后的任何内容都不会在您的存储过程中结束,因为GO 将执行CREATE/ALTER PROCEDURE 命令。例如,如果你运行这个......
创建过程 X 作为 选择 1 作为 X 去 选择 2 作为 X
然后在运行它之后你返回编辑程序你会发现只有SELECT 1 As X在那里,因为GO创建了sproc,之后的任何东西都被认为是你接下来要做的事情,并且不是存储过程的一部分。
将GO 视为告诉 SSMS 将其上方的任何内容发送到服务器以执行的一种方式。服务器永远不会收到GO,因为它只是用来标记您希望 SSMS 发送到服务器的一批命令的结束。
如果您有需要在存储过程中控制执行流程的场景,那么您可以使用 BEGIN TRANSACTION 和 COMMIT TRANSACTION 来实现,这些在存储过程中是允许的。
【讨论】:
GO 不是对服务器的命令,它是 MS 提供的大多数客户端工具的默认批处理分隔符。当客户端工具自己在新的一行遇到“GO”时,它会将迄今为止积累的所有命令发送到服务器,然后重新开始。
这意味着在一个批次中声明的任何变量在后续批次中都不可用。这也意味着不能将多行 cmets 放在“GO”命令周围 - 因为服务器将看到第一批,并看到未终止的注释。
【讨论】:
它标志着查询分析器中批处理的结束,并且 因此表示该批处理中存储过程定义的结束。 据我所知,它不是 sp 的一部分。 GO 不是 TSQL 命令。
和;结束语句。
【讨论】: