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

odi*_*seh 16 sql-server stored-procedures

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

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

Go 要么 ;

Far*_*ruz 23

; 刚刚结束声明.

GO不是语句,而是服务器将当前批处理提交到数据库的命令.它在事务中创建一个停止.

http://msdn.microsoft.com/en-us/library/ms188037.aspx

(更新,感谢评论):
就我所知,GO是一份针对管理工作室的声明,也许也适用于其他工具.

  • 实际上,在"管理工作室"之外去了多余.我不会(-1). (3认同)
  • 确切地说,它是对客户端工具(SSMS、osql、sqlcmd 等)的命令,而不是对服务器的命令。在其中一些工具中,可以将命令定义为其他一些序列。虽然如果有人这样做,我暗中讨厌他们以及他们创建的所有脚本。:-| (2认同)

Guf*_*ffa 13

分号分隔查询,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
Run Code Online (Sandbox Code Playgroud)


小智 5

我知道这个线程很旧,但我认为这些其他用途/差异对于像我这样的其他关于GO.

  1. 之后的任何内容GO都不会在您的 sproc 中结束,因为GO将执行CREATE/ALTER PROCEDURE命令。例如,如果您运行此...

    CREATE PROCEDURE X AS SELECT 1 As X GO SELECT 2 As X

然后在运行它之后,您返回编辑程序,您会发现只有sprocSELECT 1 As X在那里,因为GO创建了 sproc 以及它之后的任何内容都被假定为您正在做的下一件事情,而不是 sproc 的一部分。

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

可以将其GO视为告诉 SSMS 将其上方的任何内容发送到服务器以供执行的一种方式。服务器永远不会收到 ,GO因为它只是在那里标记您希望 SSMS 发送到服务器的一批命令的结束。如果您有一个需要控制存储过程中的执行流的场景,那么您可以使用BEGIN TRANSACTIONCOMMIT TRANSACTION,并且这些在存储过程中是允许的。