在SQL Server中使用GO关键字

我知道使用GO关键字。 它将多个语句作为整个组发送到sql server,而不是逐个发送每个语句。 我希望我是对的!

但我想知道程序员在实际应用程序中使用它。 就像我们创建一个存储过程,然后它也做同样的事情,它也编译代码并制定执行计划,并将整个组发送到服务器。

那么我们是否需要在数据库对象的编码中指定GO关键字,例如触发器,视图和存储过程?

GO是用于发信号通知批次结束的命令。 请注意,它不是T-SQL语句。

Batch是一组一个或多个Transact-SQL语句,它们同时从应用程序发送到SQL Server以供执行

GO在SQL Server中非常有用。 但是,只有在真正需要时才需要使用它。 因此,您需要记住,除了使用GO命令定义批处理外,还要定义该特定T-SQL代码的范围。 批处理中定义的局部变量特定于该批处理。

范围示例 –

DECLARE @STRING1 AS VARCHAR(50) DECLARE @STRING2 AS VARCHAR(50) SET @STRING1='BATCH 2' SET @STRING2='BATCH 3' SELECT @STRING1 AS RESULT GO SELECT @STRING2 AS RESULT GO 

运行此命令会给出错误,指出未声明@ STRING2。 因为该变量的范围以GO结尾。 所以要小心使用GO并巧妙地使用。

来源 – http://aartemiou.blogspot.com/2009/08/using-go-command-in-sql-server.html

GO关键字指示批处理结束到SQL Server Management Studio – 通常SQL Server Management Studio在一个批处理中执行所有语句(批处理可以被认为是数据库的往返),但在某些情况下它可能希望以不同的批次执行语句(例​​如, SET SHOWPLAN_ALL语句必须是批处理中的唯一语句)

例如,在SQL Server Management Studio中执行以下脚本:

 USE StackOverflow GO SELECT * FROM Comments 

大致相当于在C#中执行以下操作:

 using (var cmd = new SqlCommand("USE StackOverflow", conn)) { cmd.ExecuteReader(); } using (var cmd = new SqlCommand("SELECT * FROM Comments", conn)) { cmd.ExecuteReader(); } 

请注意, GO 不是 T-SQL关键字,只有SQL Server Management Studio和其他SQL工具才能理解。 例如,以下方法不起作用,将导致运行时exception:

 string cmdText = @" USE StackOverflow GO SELECT * FROM Comments"; using (var cmd = new SqlCommand(cmdText, conn)) { cmd.ExecuteReader(); } 

GO不是SQL中的关键字。 这是SSMS和其他工具的指令,可以将更大的脚本分成几批。

要添加其他人已声明的内容……您实际上无法在存储过程,触发器,视图,UDF甚至动态SQL中使用GO。 它仅用于脚本。

我怀疑你最好用分号(;)分隔语句。

不需要在SQL Server中指定GO指令。

MSDN 将Go定义为

将一批Transact-SQL语句的末尾发送到SQL Server实用程序。

并继续说

GO不是Transact-SQL语句; 它是sqlcmd和osql实用程序以及SQL Server Management Studio代码编辑器可识别的命令。

SQL Server实用程序将GO解释为它们应将当前批处理的Transact-SQL语句发送到SQL Server实例的信号。 当前批处理语句由自上次GO以来输入的所有语句组成,或者自ad hoc会话或脚本开始以来(如果这是第一个GO)。

我使用GO最常见的时间是对象创建脚本

我的创建脚本通常遵循这种模式

 USE SomeDatabase GO If Exists(SELECT * FROM ...) DROP CREATE PROC as foo BEGIN END GO Grant exec on Foo to Bar 

因此,两个GO很重要,因为我想确保我在正确的数据库上,如果没有GO,它将无法工作。 第二个GO是至关重要的,否则存储过程将尝试运行grant语句作为过程的一部分。