在存储过程中使用错误处理

时间:2015-09-09 09:51:51

标签: sql sql-server tsql

我在存储过程中找到了以下代码:

BEGIN TRAN
    SET NOCOUNT ON

    DECLARE @rerror As Int

    if not exists(select * from OfficeSchedule 
                  where OfficeID = @officeid and WeekDate = @weekdate)
    begin

        INSERT INTO OfficeSchedule (OfficeID, WeekDate, Status, CreatedBy, CreatedDate, RowStatus)
        VALUES (@officeid, @weekdate, 'U', @createdby, GetDate(), 'A')
    end

    SET @rerror = @@error

    IF @rerror <> 0 BEGIN
       ROLLBACK TRAN
    END 
    ELSE BEGIN
        COMMIT TRAN

        SELECT @@identity
     END

@error变量的目的是什么?如果插入失败,事务是否不回滚?如果我通过处理else块修改代码,如下所示:

  INSERT INTO OfficeSchedule (OfficeID, WeekDate, Status, CreatedBy, CreatedDate, RowStatus)
  VALUES (@officeid, @weekdate, 'U', @createdby, GetDate(), 'A')
end
Else
begin
    INSERT INTO OfficeSchedule (OfficeID, WeekDate, Status, CreatedBy, CreatedDate, RowStatus)
    VALUES (@officeid, getdate(), 'U', @createdby, GetDate(), 'A')
end

那么是否有必要使用错误处理?

在存储过程中使用error handling可以获得任何好处吗?

感谢您的建议。

谢谢

2 个答案:

答案 0 :(得分:0)

使用TRY..CATCH块:

  

TRY ... CATCH结构由两部分组成:TRY块和CATCH   块。在Transact-SQL语句中检测到错误条件时   在TRY块内,控制权被传递到CATCH块   可以处理错误。

.encode("raw_unicode_escape")

有关SET NOCOUNT ON; BEGIN TRY BEGIN TRAN IF NOT EXISTS (SELECT 1 FROM OfficeSchedule WHERE OfficeID=@officeid AND WeekDate=@weekdate) BEGIN INSERT INTO OfficeSchedule (OfficeID, WeekDate, Status, CreatedBy, CreatedDate, RowStatus) VALUES (@officeid, @weekdate, 'U', @createdby, GetDate(), 'A'); SELECT @@identity; END COMMIT TRAN; END TRY BEGIN CATCH ROLLBACK TRAN; -- log errors END CATCH 阻止使用中错误的更多信息:

  

错误功能

     

TRY ... CATCH使用以下错误函数来捕获错误   信息:

     

ERROR_NUMBER()返回错误编号。

     

ERROR_MESSAGE()返回错误消息的完整文本。该文本包括为任何可替换参数提供的值   例如长度,对象名称或时间。

     

ERROR_SEVERITY()返回错误严重性。

     

ERROR_STATE()返回错误状态编号。

     

ERROR_LINE()返回导致错误的例程中的行号。

     

ERROR_PROCEDURE()返回发生错误的存储过程或触发器的名称。

答案 1 :(得分:0)

来自Q. @@ERROR变量的目的是什么。如果插入失败

如果前一个语句遇到错误,则返回错误号。如果错误是sys.messages目录视图中的错误之一,则@@ERROR包含该错误的sys.messages.message_id列中的值。您可以在@@ERROR中查看与sys.messages错误号相关联的文字。

因为@@ERROR被清除并在每个执行的语句上重置,所以在验证语句之后立即检查它,或者将其保存到稍后可以检查的本地变量。 @@ERROR Description and Example

TRANSACTION & TRY-CATCH