从存储过程中返回错误代码值是好的做法吗?
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 块上起作用的错误都应该出现异常。
在我们公司,我们使用四种类型的简单存储过程(插入、更新、删除、选择);数据库组坚持一个规则,即每个存储过程都应包含 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 块上起作用的错误都应该出现异常。