假设我某个表T1(c1,c2),其中c1是键,已有记录
1,'111'
2,'222'
我现在存储过程中
SET XACT_ABORT OFF
INSERT INTO T1 VLAUES(1,3)
if @error=0 
    print '插入成功'
else
    print '插入失败'
--底下为接着的处理
最后
SET XACT_ABORT ON
问题是程序还是会蹦出来,我不想它蹦出来,只想继续处理。

解决方案 »

  1.   


    SET XACT_ABORT OFF 这个设置并不是不让错误抛出,而是不做整体事务的回滚。SQL Server 2000还做不到这一点。
      

  2.   


    --只回滚当前出错的SQL语句SET XACT_ABORT OFF 
    --回滚出错SQL所在的整个事务的所有SQL操作SET XACT_ABORT ON
      

  3.   

    如果设置了 Set XACT_ABORT ON是不是就不需要ROLLBACK TRAN这句话了?
    @wangtiecheng,“SQL Server 2000还做不到这一点。”这句话是什么意思,我在SQL SERVER200用过,没问题啊
      

  4.   

    SET XACT_ABORT
    指定当 Transact-SQL 语句产生运行时错误时,Microsoft® SQL Server™ 是否自动回滚当前事务。语法
    SET XACT_ABORT { ON | OFF }注释
    当 SET XACT_ABORT 为 ON 时,如果 Transact-SQL 语句产生运行时错误,整个事务将终止并回滚。为 OFF 时,只回滚产生错误的 Transact-SQL 语句,而事务将继续进行处理。编译错误(如语法错误)不受 SET XACT_ABORT 的影响。对于大多数 OLE DB 提供程序(包括 SQL Server),隐性或显式事务中的数据修改语句必须将 XACT_ABORT 设置为 ON。唯一不需要该选项的情况是提供程序支持嵌套事务时。有关更多信息,请参见分布式查询和分布式事务。 SET XACT_ABORT 的设置是在执行或运行时设置,而不是在分析时设置。
      

  5.   

    @wangtiechengSET XACT_ABORT 的设置是在执行或运行时设置,而不是在分析时设置这句话是什么意思?谢谢
      

  6.   

    2005里还可以用try catch
    2000里不行
      

  7.   

    SET XACT_ABORT OFF
    BEGIN TRAN
    INSERT INTO T1 VLAUES(1,3)
    COMMIT TRANSET XACT_ABORT OFF是用在事务里的,你这里并没有写事务啊