如何將sql執(zhí)行的錯誤消息記錄到本地文件中實現(xiàn)過程
其實大家都知道sql語句的錯誤信息都可以在sys.messages表里面找到
如:

如果在執(zhí)行語句在try...catch中 我們可以通過以下方法獲取錯誤信息。sql語句如下:
BEGIN TRY
SELECT 3 / 0
END TRY
BEGIN CATCH
DECLARE @errornumber INT
DECLARE @errorseverity INT
DECLARE @errorstate INT
DECLARE @errormessage NVARCHAR(4000)
SELECT @errornumber = ERROR_NUMBER() ,
@errorseverity = ERROR_SEVERITY() ,
@errorstate = ERROR_STATE() ,
@errormessage = ERROR_MESSAGE()
SELECT @errornumber ,
@errorseverity ,
@errorstate ,
@errormessage
RAISERROR (
@errormessage, -- Message text,
@errorseverity, -- Severity,
@errorstate, -- State,
@errornumber
);
END CATCH
當然我這里是故意用RAISERROR再次拋出錯誤信息,運行結果如下:

現(xiàn)在我們來定義一個存儲過程,其目的就是往本地文件中寫入信息。
sql腳本如下:
CREATE Proc [dbo].[UCreateOrAppendTextFile](@Filename VarChar(100),@Text nVarchar(4000))
AS
DECLARE @FileSystem int
DECLARE @FileHandle int
DECLARE @RetCode int
DECLARE @RetVal int
DECLARE @CreateOrAppend int
EXECUTE @RetCode = sp_OACreate 'Scripting.FileSystemObject' , @FileSystem OUTPUT
IF (@@ERROR|@RetCode > 0 Or @FileSystem < 0)
RAISERROR ('could not create FileSystemObject',16,1)
EXECUTE @RetCode = sp_OAMethod @FileSystem , 'FileExists', @RetVal out, @FileName
IF (@@ERROR|@RetCode > 0)
RAISERROR ('could not check file existence',16,1)
-- If file exists then append else create
SET @CreateOrAppend = case @RetVal when 1 then 8 else 2 end
EXECUTE @RetCode = sp_OAMethod @FileSystem , 'OpenTextFile' , @FileHandle OUTPUT , @Filename, @CreateOrAppend, 1
IF (@@ERROR|@RetCode > 0 Or @FileHandle < 0)
RAISERROR ('could not create File',16,1)
EXECUTE @RetCode = sp_OAMethod @FileHandle , 'WriteLine' , NULL , @text
IF (@@ERROR|@RetCode > 0 )
RAISERROR ('could not write to File',16,1)
EXECUTE @RetCode = sp_OAMethod @FileHandle , 'Close'
IF (@@ERROR|@RetCode > 0)
RAISERROR ('Could not close file ',16,1)
EXEC sp_OADestroy @filehandle
IF (@@ERROR|@RetCode > 0)
RAISERROR ('Could not destroy file object',16,1)
EXEC sp_OADestroy @FileSystem
----------------------------------------
然后執(zhí)行該存儲過程:
exec UCreateOrAppendTextFile 'C:\Error.log','hello majaing'
如果遇到以下錯誤則說明Ole Automation Procedures沒有啟用

需要執(zhí)行以下SQL:
go
sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO
sp_configure 'Ole Automation Procedures', 1;
GO
RECONFIGURE;
GO
運行即如果如圖:

當然這里運行存儲過程之前必須保證 文件是存在的。
最后封裝一個存儲過程獲取錯誤信息,其腳本如下:
CREATE PROCEDURE LOGError(@msg nvarchar(400))
as
declare @text nvarchar(400)
SELECT @text=text FROM sys.messages WHERE language_id=1033 AND message_id=@@ERROR
if len(@text)>1
begin
set @msg=@msg +' : '+@text
EXEC dbo.UCreateOrAppendTextFile 'C:\Error.log',@msg
end
執(zhí)行存儲過程及結果如下:

以上存儲過程在MSSQL2005、2012中測試通過。
大家都知道目前在文件系統(tǒng)中事務的實現(xiàn)還是比較復雜的,雖然在win7后我們可以用C#實現(xiàn)文件的事務,但是微軟的分布式事務Distributed Transaction Coordinator(msdtc)目前也還不支持文件事務。
這里說說為什么有這樣的需求吧:目前需要一個項目用SSIS做數(shù)據(jù)遷移,其中很大部分都是用sql語句實現(xiàn)的, 如 insert into ....select ... from xxxx.其中原數(shù)據(jù)庫中難免有什么臟數(shù)據(jù)導致插入失敗,于是我在SSIS中使用msdtc服務,保證數(shù)據(jù)的一致性。雖然SSIS也有錯誤處理,但是它只能記錄那個sql語句有問題,而不能記錄具體問題。于是我想到把錯誤信心記錄報數(shù)據(jù)庫表里面,可是當遇到問題時事務會回滾,表里面根本就沒有錯誤信息。于是乎 只能報錯誤信息記錄到文件中了。
如:




有不對的地方還請大家拍磚哦!
相關文章
INSERT INTO SELECT語句與SELECT INTO FROM語句的一些區(qū)別
INSERT INTO SELECT語句與SELECT INTO FROM語句的一些區(qū)別介紹,需要的朋友可以參考下面的說明與條件2012-05-05
Sql Server 2012 分頁方法分析(offset and fetch)
最近在分析 Sql Server 2012 中 offset and fetch 的新特性,發(fā)現(xiàn) offset and fetch 無論語法的簡潔還是功能的強大,都是相當相當不錯的2012-08-08
SQL參數(shù)化查詢的另一個理由 命中執(zhí)行計劃
為了提高數(shù)據(jù)庫運行的效率,我們需要盡可能的命中執(zhí)行計劃,這樣就可以節(jié)省運行時間2012-08-08
SQLServer觸發(fā)器調(diào)用JavaWeb接口的過程詳解
sqlServer要想調(diào)用web接口,就要使用自帶的存儲過程。而這些存儲過程2005版本以后默認時關閉的,所以要先開啟。對SQLServer觸發(fā)器調(diào)用JavaWeb接口的過程感興趣的朋友一起看看吧2021-12-12
SQL Server數(shù)據(jù)庫簡單的事務日志備份恢復流程
在一些對數(shù)據(jù)可靠性要求很高的行業(yè),若發(fā)生意外停機或數(shù)據(jù)丟失,其損失是十分慘重的,數(shù)據(jù)庫管理員應針對具體的業(yè)務要求指定詳細的數(shù)據(jù)庫備份與災難恢復策略,本文給大家詳細介紹了SQL Server數(shù)據(jù)庫簡單的事務日志備份恢復流程,需要的朋友可以參考下2024-09-09
SQL Server 數(shù)據(jù)庫的更改默認備份目錄的詳細步驟
這篇文章主要介紹了SQL Server 數(shù)據(jù)庫的更改默認備份目錄的詳細步驟,需要的朋友可以參考下2023-04-04

