存储过程API的最佳实践?

时间:2009-12-18 17:59:38

标签: sql-server api stored-procedures

我们正在为我们的产品添加一些可由第三方客户端调用的存储过程。是否有参数验证,返回值,RAISERROR等的最佳实践?

第三方客户端不能直接访问表,只能访问某些特定的sprocs。 sprocs触及的表格受到很好的约束,但我们希望尽可能方便用户,只要在错误调用sprocs时提供详细的错误信息。

2 个答案:

答案 0 :(得分:3)

  • 使用TRY / CATCH块
  • 抛出有意义的消息(我使用诸如“INFO:”之类的前缀来区分我的错误和数据库错误)

示例:

SET NOCOUNT, XACT_ABORT ON
...
BEGIN TRY
    IF @parameter1 IS NULL
        RAISERROR ('INFO: "parameter1" should not be blank', 16, 1)

    IF @parameter2 < 0
        RAISERROR ('INFO: "parameter2" must be greate then zero', 16, 1)

    ...

END TRY
BEGIN CATCH
    DECLARE @MyError nvarchar(2048)
    SELECT @MyError = ERROR_MESSAGE() -- + other stuff, like stored proc name perhaps
    RAISERROR (@MyError, 16, 1)
    ...
END CATCH

答案 1 :(得分:2)

提供人类可以理解的信息错误消息并不困难。只是RAISERROR带有描述性文字。更难以提出本地化文本,这意味着正确使用sp_addmessage和家庭。真正的难题是提高程序可以做出反应的错误。这意味着正确记录的错误代码(严重性状态),以及在API中使用它们的严格代码规则。

不要忘记正确的事务嵌套。我的博客上有一个示例,说明如何正确处理与T-SQL异常相关的事务:Exception handling and nested transactions

不幸的是,整个客户端/ T-SQL堆栈相对于异常的最新技术存在一些问题。最值得注意的是,如果您遇到T-SQL异常,则无法重新抛出它,因此您的客户端无法预期典型的系统错误编号。请参阅SQL Server:Rethrow exception with the original exception number。除了在超过50000范围内使用您自己的错误编号之外,这使您几乎无法传达正确的错误信息,这在“转换”错误代码的数量增加时非常麻烦,并且使用错误消息字符串作为异常信息