有些地方不明确,重写:着手写了一些存储过程,发现sql server存储过程的捕获错误的能力很弱,
存储过程在处理数据过程肯定会发现一些错误,
这可以处理,如给上级调用者返回错误码及错误信息,
以及回滚或刷新状态字段值;
也会发生一些错误,有些通过@@error监测到,
但有些错误让你监测@@error的机会都没有,
所以这些处理错误的代码没有机会执行。
还发生过一种情况,存储过程中确实发生错误并直接跳出到
客户端程序,但客户端程序却也没有捕获到错误
(用on error goto ... 或 try...catch),但command的返回值是空所以我决定
1)数据访问组件或客户端程序调用者负责事务的发起,提交,回滚
2)若在不用事务的情况下(如批量处理数据),
   数据访问组件或客户端程序调用者负责刷新有关状态字段的值(表示批处理的状态)
3)由于不能指望存储过程捕获所有可能的错误,所以不如不定义存储过程错误返回值,
   有什么问题就raiserror高级别的错误(如16),越过上级存储过程调用者,
   直接通知数据访问组件或客户端程序。
4)若存储过程执行成功,返回0
5)数据访问组件或客户端程序负责捕获存储过程中的错误
   还需判断存储过程的返回值是否为null请高手指点

解决方案 »

  1.   

    http://expert.csdn.net/Expert/TopicView1.asp?id=1675986
      

  2.   

    to 大力"这样你可以发现通过exec或sp_executesql执行可疑的sql,这样就可以在后面捕捉到被异常终止的错误。"
    大力,你的以上结论至少对我的例子无效。declare @strSql varchar(200)
    set @strSql = 'bulk insert 表名 from ''d:\不存在的文件.txt'''
    exec(@strSql)
    if @@error <> 0
        print '这个没有输出'所以还是没有一个在存储过程中可靠捕获错误的解决方法。
      

  3.   

    改正:
    1)“还发生过一种情况,存储过程中确实发生错误并直接跳出到
    客户端程序,但客户端程序却也没有捕获到错误
    (用on error goto ... 或 try...catch),但command的返回值是空”这在VB6.0+ADO中发生过,但用VB.NET+ADO.NET未发生
    2)raiserror不能越过上级调用者(不象c++/java中throw,vb中err.raise),
    执行后,仍然会继续执行下续语句,
    我理解错了。