我在存储过程中找到了以下代码:
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
可以获得任何好处吗?
感谢您的建议。
谢谢
答案 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