none
在批处理后面加GO与不加GO都会执行后面的SQL语句 RRS feed

  • 问题

  • 今天看到一篇文章,说在事务里面在提交事务语句后面用GO,COMMIT TRANSACTION后面的语句才会继续执行(如果事务执行成功),否则不会继续执行

    BEGIN TRANSACTION
    sql语句
    
    COMMIT TRANSACTION
    
    GO
    
    sql语句

    是不是可以分两种情况

    1、事务执行成功:加不加GO ,COMMIT TRANSACTION后面的语句都会继续执行

    2、事务执行失败:一定要GO,否则COMMIT TRANSACTION后面的语句不会继续执行


    给我写信: QQ我:点击这里给我发消息

    2012年8月10日 4:12

答案

  • 加上 GO 之后,如果 COMMIT 和前面的语句是两个不同的批次,所以前面失败不影响后面的执行

    不加的话,是同一个批处理中执行,具体是执行出错中止,还是继续,这个跟错误的严重级别有关

    2012年8月10日 5:43

全部回复

  • GO 不是 Transact-SQL 语句;它是可由 sqlcmdosql 实用工具以及 SQL
    Server Management Studio 代码编辑器识别的命令。

    2012年8月10日 5:41
  • 加上 GO 之后,如果 COMMIT 和前面的语句是两个不同的批次,所以前面失败不影响后面的执行

    不加的话,是同一个批处理中执行,具体是执行出错中止,还是继续,这个跟错误的严重级别有关

    2012年8月10日 5:43
  • 比如说,下面的这个,虽然第一句出错了,但是第二句还是执行了

    SELECT 1/0
    SELECT 2

    而对于下面这个错误,则第二句没有执行

    SELECT * FROM TB
    SELECT 2

    2012年8月10日 5:46
  • 比如说,下面的这个,虽然第一句出错了,但是第二句还是执行了

    SELECT 1/0
    SELECT 2

    而对于下面这个错误,则第二句没有执行

    SELECT * FROM TB
    SELECT 2


    select * from TB 有什么错?而且你没有加入GO

    给我写信: QQ我:点击这里给我发消息

    2012年8月10日 7:42
  • 比如说,下面的这个,虽然第一句出错了,但是第二句还是执行了

    SELECT 1/0
    SELECT 2

    而对于下面这个错误,则第二句没有执行

    SELECT * FROM TB
    SELECT 2


    select * from TB 有什么错?而且你没有加入GO

    给我写信: QQ我:点击这里给我发消息

    没有 TB 这个表的话,不就出错了么?

    我的例子说的就是不加GO的情况下,是否会执行后面的语句具有不确定性(当然就不能加GO了)

    2012年8月10日 7:49
  • 那么存储过程一般加不加GO ,我看公司的存储过程都没有加GO的,是不是出错就不执行了,就不用加GO 了?

    --存储过程片段	
    	IF (@@ERROR <> 0)
    		BEGIN
    			PRINT('ROLLBACK TRANSACTION')
    			ROLLBACK TRANSACTION
    			SET @ReturnValue = -2
    		END
    		ELSE
    		BEGIN
    			COMMIT TRANSACTION
    			SET @ReturnValue = 0
    		END
    	END
    RETURN @ReturnValue
    


    给我写信: QQ我:点击这里给我发消息

    2012年8月10日 7:55
  • 存储过程没办法加GO, 因为 GO 不是 T-SQL 语句, 最前面已经说过了

    至于",是不是出错就不执行了,就不用加GO 了?" 点, 前面也已经说过了, 跟错误类型和严重程度相关, 是否往下执行具有不确定性

    比如像表不存在这种错误, 是不会到你的存储过程片断中的 IF @@ERROR 的判断的部分的

    2012年8月10日 8:27
  • 另外提一下, 如果要强制做到出错终止, 可以在最前面放一条语句,  SET XACT_ABORT ON, 这样出错就肯定会终止处理, 并且回滚事务(如果有事务的话)

    2012年8月10日 8:30
  • SET XACT_ABORT ON 这个我知道,昨晚看书的时候都有说到

    如果 IF @@ERROR 的判断部分不会执行到,那么这个 IF @@ERROR 判断部分就没有存在的意义了?是不是这样,还是跟你说的跟错误严重级别有关

    对于会不会出现严重到不会执行到 IF @@ERROR判断部分的错误就由程序员自己去把握

    对吗?


    给我写信: QQ我:点击这里给我发消息

    2012年8月10日 9:00
  • 如果 SET XACT_ABORT ON 的话,确实没有必要写那个判断, 否则的话, 因为大多数情况还是会往后执行(具体取决于出错时的错误类型和严重级别), 所以判断还是有意义的
    2012年8月10日 9:13
  • 我看见每个存储过程都没有显式加上SET XACT_ABORT ON

    所以执行事务的存储过程都加上判断咯


    给我写信: QQ我:点击这里给我发消息

    2012年8月10日 9:49
  • 还有一个问题,如果出错了就不会执行最后那句

    return @returnvalue 了吧,估计我的同事不会犯这个错误

    麻烦邹建大侠你了,问这麽多问题


    给我写信: QQ我:点击这里给我发消息

    2012年8月10日 9:53