以前在開發中需要用到帶錯誤處理的存儲過程,在網上找到瞭解決方案,現在整理在這,以備日後所需,時間長了原文已經找不到了,感謝為我提供幫助的兄弟。 1.創建錯誤日誌表 2.創建寫入錯誤日誌的存儲過程 3.創建列印錯誤信息的存儲過程 4.創建自己的存儲過程 ...
以前在開發中需要用到帶錯誤處理的存儲過程,在網上找到瞭解決方案,現在整理在這,以備日後所需,時間長了原文已經找不到了,感謝為我提供幫助的兄弟。
1.創建錯誤日誌表
CREATE TABLE [dbo].[t_ErrorLog](
[ErrorLogID] [int] IDENTITY(1,1) NOT NULL,
[ErrorTime] [datetime] NOT NULL,
[UserName] [sysname] NOT NULL,
[ErrorNumber] [int] NOT NULL,
[ErrorSeverity] [int] NULL,
[ErrorState] [int] NULL,
[ErrorProcedure] [nvarchar](126) NULL,
[ErrorLine] [int] NULL,
[ErrorMessage] [nvarchar](4000) NOT NULL,
CONSTRAINT [PK_ErrorLog_ErrorLogID] PRIMARY KEY CLUSTERED
(
[ErrorLogID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[t_ErrorLog] ADD CONSTRAINT [DF_ErrorLog_ErrorTime] DEFAULT (getdate()) FOR [ErrorTime]
GO
2.創建寫入錯誤日誌的存儲過程
CREATE PROCEDURE [dbo].[Error_LogError]
@ErrorLogID [int] = 0 OUTPUT -- [t_ErrorLog]ID
AS
BEGIN
SET NOCOUNT ON;
-- //錯誤信息ID
SET @ErrorLogID = 0;
BEGIN TRY
-- //判斷有沒有錯誤信息
IF ERROR_NUMBER() IS NULL
RETURN;
-- //Return if inside an uncommittable transaction.
-- //Data insertion/modification is not allowed when
-- //a transaction is in an uncommittable state.
IF XACT_STATE() = -1
BEGIN
PRINT '因為當前事務處於不可提交狀態所以不能記錄錯誤信息。 '
+ '為了能夠成功記錄錯誤信息,需要在執行Error_LogError前回滾事務。';
RETURN;
END
INSERT [dbo].[t_ErrorLog]
(
[UserName],
[ErrorNumber],
[ErrorSeverity],
[ErrorState],
[ErrorProcedure],
[ErrorLine],
[ErrorMessage]
)
VALUES
(
CONVERT(sysname, CURRENT_USER),
ERROR_NUMBER(),
ERROR_SEVERITY(),
ERROR_STATE(),
ERROR_PROCEDURE(),
ERROR_LINE(),
ERROR_MESSAGE()
);
SET @ErrorLogID = @@IDENTITY;
END TRY
BEGIN CATCH
EXECUTE Error_PrintError;--//列印錯誤信息的存儲過程
RETURN -1;
END CATCH
END
3.創建列印錯誤信息的存儲過程
CREATE PROCEDURE [dbo].[Error_PrintError]
AS
BEGIN
SET NOCOUNT ON;
-- Print error information.
PRINT 'Error ' + CONVERT(varchar(50), ERROR_NUMBER()) +
', Severity ' + CONVERT(varchar(5), ERROR_SEVERITY()) +
', State ' + CONVERT(varchar(5), ERROR_STATE()) +
', Procedure ' + ISNULL(ERROR_PROCEDURE(), '-') +
', Line ' + CONVERT(varchar(5), ERROR_LINE());
PRINT ERROR_MESSAGE();
END
4.創建自己的存儲過程
CREATE PROCEDURE PROCEDURE_NAME
AS
BEGIN
SET NOCOUNT ON;
BEGIN TRY--//開始捕捉異常
BEGIN TRAN--//開始事務
--//你的方法
COMMIT TRAN --//提交事務
END TRY--//結束捕捉異常
BEGIN CATCH--//有異常被捕獲
IF @@TRANCOUNT > 0--//判斷有沒有事務
BEGIN
ROLLBACK TRAN--//回滾事務
END
DECLARE @ErrorLogID INT ;
EXEC Error_LogError @ErrorLogID OUTPUT;--//執行存儲過程將錯誤信息記錄在表當中
END CATCH--//結束異常處理
END