(转贴) SQL Server2000中的批处理(Go详解)

Posted on 2008-02-13 14:57  蓝箭GZ  阅读(1671)  评论(0编辑  收藏  举报
 

请问各位高手,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到底有什么不同阿?大家帮帮忙,谢谢了。问题点数:20、回复次数:6Top

1 aw511(点点星灯)回复于 2005-09-04 19:09:56 得分 0

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

2 aw511(点点星灯)回复于 2005-09-04 19:10:07 得分 0

批处理  
 
批处理是包含一个或多个   Transact-SQL   语句的组,从应用程序一次性地发送到   Microsoft®   SQL   Server™   执行。SQL   Server   将批处理语句编译成一个可执行单元,此单元称为执行计划。执行计划中的语句每次执行一条。  
   
 
编译错误(如语法错误)使执行计划无法编译,从而导致批处理中的任何语句均无法执行。  
   
 
运行时错误(如算术溢出或违反约束)会产生以下两种影响之一:    
   
 
大多数运行时错误将停止执行批处理中当前语句和它之后的语句。  
   
   
 
少数运行时错误(如违反约束)仅停止执行当前语句。而继续执行批处理中其它所有语句。    
 
在遇到运行时错误之前执行的语句不受影响。唯一的例外是如果批处理在事务中而且错误导致事务回滚。在这种情况下,回滚运行时错误之前所进行的未提交的数据修改。  
   
 
假定在批处理中有   10   条语句。如果第五条语句有一个语法错误,则不执行批处理中的任何语句。如果编译了批处理,而第二条语句在执行时失败,则第一条语句的结果不受影响,因为它已经执行。  
   
 
以下规则适用于批处理:    
   
  CREATE   DEFAULT
CREATE   PROCEDURECREATE   RULECREATE   TRIGGER     CREATE   VIEW   语句不能在批处理中与其它语句组合使用。批处理必须以   CREATE   语句开始。所有跟在该批处理后的其它语句将被解释为第一个   CREATE   语句定义的一部分。  
   
   
 
不能在同一个批处理中更改表,然后引用新列。  
   
   
 
如果   EXECUTE   语句是批处理中的第一句,则不需要   EXECUTE   关键字。如果   EXECUTE   语句不是批处理中的第一条语句,则需要   EXECUTE   关键字。Top

3 aw511(点点星灯)回复于 2005-09-04 19:10:22 得分 10

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-LibraryODBC     OLE   DB   APIs   的应用程序试图执行   GO   命令时会收到语法错误。SQL   Server   实用工具永远不会向服务器发送   GO   命令。  
   
 
权限  
  GO  
是一个不需权限的实用工具命令。可以由任何用户执行。  
   
 
示例  
 
下面的示例创建两个批处理。第一个批处理只包含一条   USE   pubs   语句,用于设置数据库上下文。剩下的语句使用了一个局部变量,因此所有的局部变量声明必须在一个批处理中。这一点可通过在最后一条引用此变量的语句之后才使用   GO   命令来做到。  
   
  USE   pubs  
  GO  
  DECLARE   @NmbrAuthors   int  
  SELECT   @NmbrAuthors   =   COUNT(*)  
  FROM   authors  
  PRINT   'The   number   of   authors   as   of   '   +  
              CAST(GETDATE()   AS   char(20))   +   '   is   '   +  
              CAST(@NmbrAuthors   AS   char   (10))  
  GO  
  Top

4 tanlei_accp(爱梦薇)回复于 2005-09-04 20:50:33 得分 0

我说老兄,不要把联机丛书当中的内容往上照搬啊。如果我能直接看懂就不用到这里来问了。  
  Top

5 EricYeung(在主里)回复于 2005-09-04 21:30:20 得分 10

下面得这种情况,go是必不可少得  
  if   exists   (select   *   from   sysobjects   where   objectproperty(object_id('mySP'),   'IsProcedure')   =   1)  
  drop   procedure   mySP  
  GO  
   
  create   procedure   mySP  
  As  
  ...Top

6 tanlei_accp(爱梦薇)回复于 2005-09-04 21:59:43 得分 0

go是表示一个批的结束,它会使SQL查询优化器生成单个执行计划。我问的是单个执行计划与多个执行计划有什么区别呢?我不把它做成一个批,一条一条的执行为什么就不行呢?还请告知。

Copyright © 2024 蓝箭GZ
Powered by .NET 9.0 on Kubernetes