请教在批处理SQL语句中GO与;( 分号)的区别

时间:2022-09-08 14:56:23
RT
今天遇到这个问题的,请大家帮我全面分析下,或者给点资料也可以。
谢谢

9 个解决方案

#1


学习.

#2


简单来说,分号是一句的结尾,GO是一段的结尾.

#3


..

#4


差不多吧

#5


没什么可比性。
;标识单句sql的结束,跟批处理无关。对一些用处较多、易造成歧义的关键字,最好以;标志,比如with。

go是批量提交的标志,处理完这一段功能,系统再去处理下一批。

#6


;是一个sql语句结束
go是一个批(多个语句)的结束

#7


可能楼主看错资料了

;在MS Sql Server 只是一个语句的结尾,可选(2008以后部分语句变成必须)
;在SYBASE Sql Server 是作为一个作用域的结束,也就是说,";"前定义的变量在";"后不可用。

GO是MS Sql Server专用的,作为一个作用域的结尾。



#8


不一样啊。
分号就是一句的事情,GO 那是一个批结束。
资料
请问各位高手,SQLServer中为什么有批处理的概念?   
下面的两组SQLServer语句使用go和不使用go好像没有区别。   
(一)   
create   table   aa(col1   int,col2   char(10))   
go   
create   table   bb(col1   int,col2   char(11))   
(二)   
create   table   aa(col1   int,col2   char(10))   
create   table   bb(col1   int,col2   char(11))   
请教高手使用go与不使用go到底有什么不同阿?大家帮帮忙,谢谢了。


使用go与不使用go到底有什么不同                             
--使用了go     将你要执行的SQL语句分割成一部分一部分来执行Top

   
批处理 (参见联机丛书)
批处理是包含一个或多个 Transact-SQL 语句的组,从应用程序一次性地发送到 Microsoft® SQL Server™ 执行。SQL Server 将批处理语句编译成一个可执行单元,此单元称为执行计划。执行计划中的语句每次执行一条。

编译错误(如语法错误)使执行计划无法编译,从而导致批处理中的任何语句均无法执行。

运行时错误(如算术溢出或违反约束)会产生以下两种影响之一:

大多数运行时错误将停止执行批处理中当前语句和它之后的语句。(遇到错误,后边的语句就别想执行了。)

少数运行时错误(如违反约束)仅停止执行当前语句。而继续执行批处理中其它所有语句。 
在遇到运行时错误之前执行的语句不受影响。唯一的例外是如果批处理在事务中而且错误导致事务回滚。在这种情况下,回滚运行时错误之前所进行的未提交的数据修改。

假定在批处理中有 10 条语句。如果第五条语句有一个语法错误,则不执行批处理中的任何语句。如果编译了批处理,而第二条语句在执行时失败,则第一条语句的结果不受影响,因为它已经执行。

以下规则适用于批处理:

CREATE DEFAULT、CREATE PROCEDURE、CREATE RULE、CREATE TRIGGER 和 CREATE VIEW 语句不能在批处理中与其它语句组合使用。批处理必须以 CREATE 语句开始。所有跟在该批处理后的其它语句将被解释为第一个 CREATE 语句定义的一部分。


不能在同一个批处理中更改表,然后引用新列。


如果 EXECUTE 语句是批处理中的第一句,则不需要 EXECUTE 关键字。如果 EXECUTE 语句不是批处理中的第一条语句,则需要 EXECUTE 关键字。


GO (参见联机丛书)

用信号通知 Microsoft® SQL Server™ 实用工具一批 Transact-SQL 语句的结束。

语法
GO

注释
GO 不是 Transact-SQL 语句;而是可为 osql 和 isql 实用工具及 SQL Server 查询分析器识别的命令。

SQL Server 实用工具将 GO 解释为应将当前的 Transact-SQL 批处理语句发送给 SQL Server 的信号。当前批处理语句是自上一 GO 命令后输入的所有语句,若是第一条 GO 命令,则是从特殊会话或脚本的开始处到这条 GO 命令之间的所有语句。SQL 查询分析器和 osql 及 isql 命令提示实用工具执行 GO 命令的方式不同。有关更多信息,请参见 osql 实用工具、isql 实用工具和 SQL 查询分析器。

GO 命令和Transact-SQL 语句不可在同一行上。但在 GO 命令行中可包含注释。

用户必须遵照使用批处理的规则。例如,在批处理中的第一条语句后执行任何存储过程必须包含 EXECUTE 关键字。局部(用户定义)变量的作用域限制在一个批处理中,不可在 GO 命令后引用。

USE pubs
GO
DECLARE @MyMsg VARCHAR(50)
SELECT @MyMsg = 'Hello, World.'
GO -- @MyMsg is not valid after this GO ends the batch.

-- Yields an error because @MyMsg not declared in this batch.
PRINT @MyMsg
GO

SELECT @@VERSION;
-- Yields an error: Must be EXEC sp_who if not first statement in 
-- batch.
sp_who
GO

SQL Server 应用程序可将多条 Transact-SQL 语句作为一个批处理发给 SQL Server 去执行。在此批处理中的语句编译成一个执行计划。程序员在 SQL Server 实用工具中执行特定语句,或生成 Transact-SQL 语句脚本在 SQL Server 实用工具中运行,用 GO 来标识批处理的结束。

如果基于 DB-Library、ODBC 或 OLE DB APIs 的应用程序试图执行 GO 命令时会收到语法错误。SQL Server 实用工具永远不会向服务器发送 GO 命令。

权限
GO 是一个不需权限的实用工具命令。可以由任何用户执行。


在存储过程中GO语句在其尾部。

#9


引用 7 楼 haiwer 的回复:
可能楼主看错资料了

;在MS Sql Server 只是一个语句的结尾,可选(2008以后部分语句变成必须)
;在SYBASE Sql Server 是作为一个作用域的结束,也就是说,";"前定义的变量在";"后不可用。

GO是MS Sql Server专用的,作为一个作用域的结尾。


海爷说的是 

#1


学习.

#2


简单来说,分号是一句的结尾,GO是一段的结尾.

#3


..

#4


差不多吧

#5


没什么可比性。
;标识单句sql的结束,跟批处理无关。对一些用处较多、易造成歧义的关键字,最好以;标志,比如with。

go是批量提交的标志,处理完这一段功能,系统再去处理下一批。

#6


;是一个sql语句结束
go是一个批(多个语句)的结束

#7


可能楼主看错资料了

;在MS Sql Server 只是一个语句的结尾,可选(2008以后部分语句变成必须)
;在SYBASE Sql Server 是作为一个作用域的结束,也就是说,";"前定义的变量在";"后不可用。

GO是MS Sql Server专用的,作为一个作用域的结尾。



#8


不一样啊。
分号就是一句的事情,GO 那是一个批结束。
资料
请问各位高手,SQLServer中为什么有批处理的概念?   
下面的两组SQLServer语句使用go和不使用go好像没有区别。   
(一)   
create   table   aa(col1   int,col2   char(10))   
go   
create   table   bb(col1   int,col2   char(11))   
(二)   
create   table   aa(col1   int,col2   char(10))   
create   table   bb(col1   int,col2   char(11))   
请教高手使用go与不使用go到底有什么不同阿?大家帮帮忙,谢谢了。


使用go与不使用go到底有什么不同                             
--使用了go     将你要执行的SQL语句分割成一部分一部分来执行Top

   
批处理 (参见联机丛书)
批处理是包含一个或多个 Transact-SQL 语句的组,从应用程序一次性地发送到 Microsoft® SQL Server™ 执行。SQL Server 将批处理语句编译成一个可执行单元,此单元称为执行计划。执行计划中的语句每次执行一条。

编译错误(如语法错误)使执行计划无法编译,从而导致批处理中的任何语句均无法执行。

运行时错误(如算术溢出或违反约束)会产生以下两种影响之一:

大多数运行时错误将停止执行批处理中当前语句和它之后的语句。(遇到错误,后边的语句就别想执行了。)

少数运行时错误(如违反约束)仅停止执行当前语句。而继续执行批处理中其它所有语句。 
在遇到运行时错误之前执行的语句不受影响。唯一的例外是如果批处理在事务中而且错误导致事务回滚。在这种情况下,回滚运行时错误之前所进行的未提交的数据修改。

假定在批处理中有 10 条语句。如果第五条语句有一个语法错误,则不执行批处理中的任何语句。如果编译了批处理,而第二条语句在执行时失败,则第一条语句的结果不受影响,因为它已经执行。

以下规则适用于批处理:

CREATE DEFAULT、CREATE PROCEDURE、CREATE RULE、CREATE TRIGGER 和 CREATE VIEW 语句不能在批处理中与其它语句组合使用。批处理必须以 CREATE 语句开始。所有跟在该批处理后的其它语句将被解释为第一个 CREATE 语句定义的一部分。


不能在同一个批处理中更改表,然后引用新列。


如果 EXECUTE 语句是批处理中的第一句,则不需要 EXECUTE 关键字。如果 EXECUTE 语句不是批处理中的第一条语句,则需要 EXECUTE 关键字。


GO (参见联机丛书)

用信号通知 Microsoft® SQL Server™ 实用工具一批 Transact-SQL 语句的结束。

语法
GO

注释
GO 不是 Transact-SQL 语句;而是可为 osql 和 isql 实用工具及 SQL Server 查询分析器识别的命令。

SQL Server 实用工具将 GO 解释为应将当前的 Transact-SQL 批处理语句发送给 SQL Server 的信号。当前批处理语句是自上一 GO 命令后输入的所有语句,若是第一条 GO 命令,则是从特殊会话或脚本的开始处到这条 GO 命令之间的所有语句。SQL 查询分析器和 osql 及 isql 命令提示实用工具执行 GO 命令的方式不同。有关更多信息,请参见 osql 实用工具、isql 实用工具和 SQL 查询分析器。

GO 命令和Transact-SQL 语句不可在同一行上。但在 GO 命令行中可包含注释。

用户必须遵照使用批处理的规则。例如,在批处理中的第一条语句后执行任何存储过程必须包含 EXECUTE 关键字。局部(用户定义)变量的作用域限制在一个批处理中,不可在 GO 命令后引用。

USE pubs
GO
DECLARE @MyMsg VARCHAR(50)
SELECT @MyMsg = 'Hello, World.'
GO -- @MyMsg is not valid after this GO ends the batch.

-- Yields an error because @MyMsg not declared in this batch.
PRINT @MyMsg
GO

SELECT @@VERSION;
-- Yields an error: Must be EXEC sp_who if not first statement in 
-- batch.
sp_who
GO

SQL Server 应用程序可将多条 Transact-SQL 语句作为一个批处理发给 SQL Server 去执行。在此批处理中的语句编译成一个执行计划。程序员在 SQL Server 实用工具中执行特定语句,或生成 Transact-SQL 语句脚本在 SQL Server 实用工具中运行,用 GO 来标识批处理的结束。

如果基于 DB-Library、ODBC 或 OLE DB APIs 的应用程序试图执行 GO 命令时会收到语法错误。SQL Server 实用工具永远不会向服务器发送 GO 命令。

权限
GO 是一个不需权限的实用工具命令。可以由任何用户执行。


在存储过程中GO语句在其尾部。

#9


引用 7 楼 haiwer 的回复:
可能楼主看错资料了

;在MS Sql Server 只是一个语句的结尾,可选(2008以后部分语句变成必须)
;在SYBASE Sql Server 是作为一个作用域的结束,也就是说,";"前定义的变量在";"后不可用。

GO是MS Sql Server专用的,作为一个作用域的结尾。


海爷说的是