今天看到一篇文章,说在事务里面在提交事务语句后面用GO,COMMIT TRANSACTION后面的语句才会继续执行(如果事务执行成功),否则不会继续执行
BEGIN TRANSACTION sql语句 COMMIT TRANSACTION GO sql语句
是不是可以分两种情况
1、事务执行成功:加不加GO ,COMMIT TRANSACTION后面的语句都会继续执行
2、事务执行失败:一定要GO,否则COMMIT TRANSACTION后面的语句不会继续执行
给我写信: QQ我:
加上 GO 之后,如果 COMMIT 和前面的语句是两个不同的批次,所以前面失败不影响后面的执行
不加的话,是同一个批处理中执行,具体是执行出错中止,还是继续,这个跟错误的严重级别有关
GO 不是 Transact-SQL 语句;它是可由 sqlcmd 和 osql 实用工具以及 SQL Server Management Studio 代码编辑器识别的命令。
比如说,下面的这个,虽然第一句出错了,但是第二句还是执行了
SELECT 1/0 SELECT 2
而对于下面这个错误,则第二句没有执行
SELECT * FROM TB SELECT 2
比如说,下面的这个,虽然第一句出错了,但是第二句还是执行了 SELECT 1/0 SELECT 2 而对于下面这个错误,则第二句没有执行 SELECT * FROM TB SELECT 2
比如说,下面的这个,虽然第一句出错了,但是第二句还是执行了 SELECT 1/0 SELECT 2 而对于下面这个错误,则第二句没有执行 SELECT * FROM TB SELECT 2 select * from TB 有什么错?而且你没有加入GO 给我写信: QQ我:
没有 TB 这个表的话,不就出错了么?
我的例子说的就是不加GO的情况下,是否会执行后面的语句具有不确定性(当然就不能加GO了)
那么存储过程一般加不加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
存储过程没办法加GO, 因为 GO 不是 T-SQL 语句, 最前面已经说过了
至于",是不是出错就不执行了,就不用加GO 了?" 点, 前面也已经说过了, 跟错误类型和严重程度相关, 是否往下执行具有不确定性
比如像表不存在这种错误, 是不会到你的存储过程片断中的 IF @@ERROR 的判断的部分的
另外提一下, 如果要强制做到出错终止, 可以在最前面放一条语句, SET XACT_ABORT ON, 这样出错就肯定会终止处理, 并且回滚事务(如果有事务的话)
SET XACT_ABORT ON 这个我知道,昨晚看书的时候都有说到
如果 IF @@ERROR 的判断部分不会执行到,那么这个 IF @@ERROR 判断部分就没有存在的意义了?是不是这样,还是跟你说的跟错误严重级别有关
对于会不会出现严重到不会执行到 IF @@ERROR判断部分的错误就由程序员自己去把握
对吗?
我看见每个存储过程都没有显式加上SET XACT_ABORT ON
所以执行事务的存储过程都加上判断咯
还有一个问题,如果出错了就不会执行最后那句
return @returnvalue 了吧,估计我的同事不会犯这个错误
麻烦邹建大侠你了,问这麽多问题