如何將sql執(zhí)行的錯誤消息記錄到本地文件中實現(xiàn)過程_Mssql數(shù)據(jù)庫教程
推薦:sql server 2008中的apply運算符使用方法sql server 2008中的apply運算符使用方法,需要的朋友可以參考一下
其實大家都知道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
當(dāng)然我這里是故意用RAISERROR再次拋出錯誤信息,運行結(jié)果如下:

現(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
運行即如果如圖:

當(dāng)然這里運行存儲過程之前必須保證 文件是存在的。
最后封裝一個存儲過程獲取錯誤信息,其腳本如下:
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í)行存儲過程及結(jié)果如下:

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




有不對的地方還請大家拍磚哦!
分享:sql中case語句的用法淺談今天看資料的時候,看到了sql中使用case的一些使用方法,做個記錄
- sql 語句練習(xí)與答案
- 深入C++ string.find()函數(shù)的用法總結(jié)
- SQL Server中刪除重復(fù)數(shù)據(jù)的幾個方法
- sql刪除重復(fù)數(shù)據(jù)的詳細方法
- SQL SERVER 2000安裝教程圖文詳解
- 使用sql server management studio 2008 無法查看數(shù)據(jù)庫,提示 無法為該請求檢索數(shù)據(jù) 錯誤916解決方法
- SQLServer日志清空語句(sql2000,sql2005,sql2008)
- Sql Server 2008完全卸載方法(其他版本類似)
- sql server 2008 不允許保存更改,您所做的更改要求刪除并重新創(chuàng)建以下表
- SQL Server 2008 清空刪除日志文件(瞬間日志變幾M)
- Win7系統(tǒng)安裝MySQL5.5.21圖解教程
- 將DataTable作為存儲過程參數(shù)的用法實例詳解
Mssql數(shù)據(jù)庫教程Rss訂閱編程教程搜索
Mssql數(shù)據(jù)庫教程推薦
- Sql學(xué)習(xí)第一天——SQL 將變量定義為Table類型(虛擬表)
- 剖析SQL Server2005 SQLCLR代碼安全性
- SqlServer2005 數(shù)據(jù)庫同步配置圖文詳解
- 解析SQL Server 2000 SP4與數(shù)據(jù)鏈接池問題
- 詳解MSSQL的安全設(shè)置問題
- 揭秘SQL Server查詢優(yōu)化方法
- 揭秘優(yōu)化SQL Server數(shù)據(jù)庫查詢的方法
- 談SQL Server應(yīng)用程序的高級Sql注入
- 揭秘SQL Server開發(fā)中需要注意的十個問題
- 解析SQL Server2000連接中三個最常見錯誤
猜你也喜歡看這些
- 網(wǎng)站模板MySQL timestamp自動更新時間
- 關(guān)于MySQL數(shù)據(jù)遷移--data目錄直接替換注意事項的詳解
- 怎么重置mysql的自增列AUTO_INCREMENT初時值
- PHP mysqli擴展庫 預(yù)處理技術(shù)的使用分析
- Mysql中“Insert into xxx on duplicate key update”問題
- MySQL 生成隨機密碼
- java連接mysql數(shù)據(jù)庫亂碼怎么辦
- 淺析一個MYSQL語法(在查詢中使用count)的兼容性問題
- mysql常用設(shè)置:字符集編碼、自動完成(自動提示)、監(jiān)聽外網(wǎng)ip
- MySQL索引簡單分析
- 相關(guān)鏈接:
- 教程說明:
Mssql數(shù)據(jù)庫教程-如何將sql執(zhí)行的錯誤消息記錄到本地文件中實現(xiàn)過程
。