如何编写这个存储过程,这样就不会隐藏错误

时间:2010-03-18 14:54:02

标签: sql sql-server stored-procedures

目前我用这种方式编写存储过程:

create proc doStuff
@amount int
as
begin try
begin tran
...
if something begin  select 'not_good' rollback return end
if someelse begin  select 'some_other_thing' rollback return end
--do the stuff
...
commit 
end try
begin catch 
if @@trancount > 0 rollback
select 'error'
end catch

这种方法的问题在于我隐藏了错误,有人知道这样做吗?

3 个答案:

答案 0 :(得分:3)

您使用的数据库是什么?在SQL Server中,您可以使用关键字RASIERROR生成错误消息。见RAISERROR (Transact-SQL)

答案 1 :(得分:2)

在这里假设SQL Server,因为它看起来很像SQL Server语法:

最好,您还应该使用SAVE TRAN,这样您就可以将该过程视为自己的工作单元,并让调用者选择是否回滚整个事务(而不是只回滚这个特定区块的工作)。 Remus Rusanu一段时间后写了一篇关于这篇文章的文章。

暂时把它放在一边,你需要在捕获之后立即保存错误,然后在回滚后重新提升它(通常有一些额外的信息):

CREATE PROCEDURE xyz [params]
AS
BEGIN
    BEGIN TRY
        BEGIN TRAN
        -- Do the work
        COMMIT
    END TRY
    BEGIN CATCH
        DECLARE
            @Error int,
            @Severity int,
            @Message varchar(4000)
        SELECT
            @Error = ERROR_NUMBER(),
            @Severity = ERROR_SEVERITY(),
            @Message = ERROR_MESSAGE()
        ROLLBACK
        RAISERROR('Procedure xyz: %d: %s', @Severity, 1, @Error, @Message)
    END CATCH
END

答案 2 :(得分:1)

SQL server sp。

create procedure doStuff
(
   @amount int
) 
as
begin try
   begin transaction

    if something
        raiserror('not_good', 16, 1)

    if somethingelse
        raiserror('some_other_thing', 16, 1)

    do stuff here

   commit
end try
begin catch
    if @@trancount > 0
        rollback

    declare @errmsg nvarchar(4000), @errseverity int
    select @errmsg = error_message(), @errseverity = error_severity()

    raiserror(@errmsg, @errseverity, 1)
end catch