我们正在为我们的产品添加一些可由第三方客户端调用的存储过程。是否有参数验证,返回值,RAISERROR等的最佳实践?
第三方客户端不能直接访问表,只能访问某些特定的sprocs。 sprocs触及的表格受到很好的约束,但我们希望尽可能方便用户,只要在错误调用sprocs时提供详细的错误信息。
答案 0 :(得分:3)
示例:
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范围内使用您自己的错误编号之外,这使您几乎无法传达正确的错误信息,这在“转换”错误代码的数量增加时非常麻烦,并且使用错误消息字符串作为异常信息