从存储过程中返回错误代码值是好的做法吗?

Is returning an error code value from stored procedure good practice?

在我们公司,我们使用四种类型的简单存储过程(插入、更新、删除、选择);数据库组坚持一个规则,即每个存储过程都应包含 update/delete/insert 存储过程类型的 return 值中的 "error code"。

举例说明:

-------------------    
--INSERT sp example
-------------------
 INSERT INTO dbo.SomeTable(..) VALUES(...)

 if @@error <> 0
   return -1
 return 0

-------------------
--UPDATE sp example
-------------------
declare
@errsql int
@updcount int

update dbo.SomeTable set foo = @bar

select @errsql = @@error, @updcount = @@rowcount
if @errSQL <> 0     
  return -1
if @updcount < 1 
  return -2
return 0    

-------------------
--DELETE sp example
-------------------
delete from dbo.SomeTable where ...

if @@error <> 0
  return -1
return 0

这个规则可以追溯到我们使用旧 ASP/VB6.0 的时代;然而长期以来我们的平台是纯 .NET 的,SQL 端的错误(例如主键 violation/unique 索引 violation/etc。)作为 .NET 异常转移到应用程序,所以遵循这个模式似乎是一种货物崇拜编程(我可以看到检查更新行数在某些情况下可能很有用,但仍然应该由应用程序开发人员驱动,而不是由数据库组驱动 - 最后你必须检查 return 中的代码该应用程序有任何影响:)。

所以我的问题是 - 你能看出这种做法有什么好处吗,或者这是经典的 cargo cult 编程示例?

如果您在项目的其余部分使用异常,我会说异常应该是可行的方法。请注意,您有 RAISEERROR (http://msdn.microsoft.com/en-us/library/ms178592.aspx) SQL 子句,因此您可以在这些存储过程中引发异常。

我认为 RAISEERROR 的严重性必须超过 16 才能作为异常引发(您可能需要检查 http://msdn.microsoft.com/en-us/library/ms164086.aspx)。任何在 TRY/CATCH SQL 块上起作用的错误都应该出现异常。