Create proc sp_A as   insert into tbl_A(A,B) values(1,'A') --values关键字写错  if @@error <>0 
        
      select 'insert into tbl_A failed'   else 
  
      select 'insert into tbl_A success' 

解决方案 »

  1.   

    是啊  insert 错误的时候就已经跳出了  不可能再往下执行了!估计要用到系统中的特殊存储过程能捕获  自己找找看
      

  2.   

    http://topic.csdn.net/u/20090326/22/f81549e2-9ef3-454a-b6fc-1c1f23390c01.html
      

  3.   

    看了很多帖子,没一个满意,
    有begin tran的
    有begin try的在存储过程中,只有出错,这些也根本没有,begin try 根本编译不过,begin tran编译过,也没用,出错直接跳出,不会给你
    rollback的执行空间。
      

  4.   

    怎么会不给rollback的执行空间呢?
    insert ta .....
    if @@error<>0 
    begin
    rollback tran 
    end.......
    commit tran
      

  5.   

    楼上的不要想当然了,insert 执行错误,直接跳出存储过程,根本不执行if @@error<>0的判断的
      

  6.   

    命名规范些吧如果是sql2008可以设置个断点,调试一下
      

  7.   

    主要是为了检测错误,出错的原因这个可以理解为重复插入相同的主键。
    一旦出错,就跳出sp,而得不到检测@@error的机会
      

  8.   

    是可以检测的,写的不对
    begin try
      insert into tbl_A(A,B) values(1,'A') --values关键字写错
    end try
    begin catch
      if @@error <>0 
            
          select 'insert into tbl_A failed'   else 
      
          select 'insert into tbl_A success' 
    end catch
    在试试
      

  9.   

    你用的是sql server2005?我是sql server2000, begin try编译都不通过的呀!!
      

  10.   

    begin try 
      insert into tbl_A(A,B) valeues(1,'A') --values关键字写错 
    end try 
    begin catch 
      if @@error <>0 
            
          select 'insert into tbl_A failed'   else 
      
          select 'insert into tbl_A success' 
    end catch 消息 102,级别 15,状态 1,第 2 行
    'valeues' 附近有语法错误。我用2005试结果这样。
      

  11.   

    看来是落伍了,我现在还在用2000版,根本就没有begn try ,end try,begin catch ,end catch
    有这个,当然可以抓到异常了。2000版,难道,使用@@error就不灵了吗?
      

  12.   

    hehe ,没注意楼主的使用环境,sql2000是不支持catch语法的,
    你可以看看如果把他写在一个显式事务里,如果该事务失败,后面的语句是否会执行,好像在批模式下,前一个语句出错后面的语句还会执行,不太确定,我现在没办法试
      

  13.   

    小错误,可以抓到,如0是除数,等则sp继续执行,如果sql严重错误,则直接跳出,执行不到检测语句的。看来2000异常处理确实有问题。
      

  14.   

    insert into tbl_A(A,B) values(1,'A') --values关键字写错
    这个错误,好像都不能通过语法检查吧,那应该是创建存储过程就失败了,何来执行、捕捉错误?
      

  15.   

    Create proc sp_A 
    as 
    begin
    set nocount on;
    insert into tbl_A(A,B) values(1,'A') if @@error <>0   
    select 'insert into tbl_A failed' 
    else
    select 'insert into tbl_A success' 
    end
    /*
    A设为主键,两次插入相同数据:
    第一次结果
    -------------------------
    insert into tbl_A successReturn Value
    ------------
    0
    第二次结果
    消息 2627,级别 14,状态 1,过程 sp_A,第 6 行
    违反了 PRIMARY KEY 约束 'PK_tbl_A'。不能在对象 'dbo.tbl_A' 中插入重复键。
    语句已终止。
    ------------------------
    insert into tbl_A failedReturn Value
    ------------
    -4
    */
      

  16.   

    楼上的,只是写错而已,不用那么较真吧!ai_li7758521 ,谢谢你。只是不知道什么时候会直接退出 sp,如 exec (
    'BULK INSERT tbl_A  FROM ''c:\temp\temp.dat'' WITH ( DATAFILETYPE = ''char'', FIELDTERMINATOR = '','', ROWTERMINATOR = ''\n'',TABLOCK)'
    )如果文件不存在,则直接退出sp,其他什么情况下,不会直接提出,继续执行,如果不直接退出的话,错误在应用程序能抓到吗?如果抓到的话,sp还会继续执行下去吗?
      

  17.   

    借人气问问:begin try
    begin transome expression...
    commit tran
    end try
    begin catch
    rollback
    end catch如果some expression 抛出异常,流程直接转到 catch块,问题是,难道一定要我们自己去rollback,而系统不会自动rollback吗?
      

  18.   

    楼上的,rollback,我的理解是rollback begin tran 后面成功的操作,如果失败的操作,是不用rollback,系统自动滚回。打个比方:bulk insert,这个操作,如果出错的话,你不用rollback ,系统会自动将bull insert操作中出错之前的插入记录自动滚回,不用操作。(我做个实验,中间有个记录插入失败,返回错误,我再差数据库,出错前的插入记录没插进去,很显然给自动滚回到执行bulk insert前的状态了。