若何將sql履行的毛病新聞記載到當地文件中完成進程。本站提示廣大學習愛好者:(若何將sql履行的毛病新聞記載到當地文件中完成進程)文章只能為提供參考,不一定能成為您想要的結果。以下是若何將sql履行的毛病新聞記載到當地文件中完成進程正文
其實年夜家都曉得sql語句的毛病信息都可以在sys.messages內外面找到
如:
假如在履行語句在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再次拋失足誤信息,運轉成果以下:
如今我們來界說一個存儲進程,其目標就是往當地文件中寫入信息。
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
----------------------------------------
然後履行該存儲進程:
exec UCreateOrAppendTextFile 'C:\Error.log','hello majaing'
假如碰到以下毛病則解釋Ole Automation Procedures沒有啟用
須要履行以下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
履行存儲進程及成果以下:
以上存儲進程在MSSQL2005、2012中測試經由過程。
年夜家都曉得今朝在文件體系中事務的完成照樣比擬龐雜的,固然在win7後我們可以用C#完成文件的事務,然則微軟的散布式事務Distributed Transaction Coordinator(msdtc)今朝也還不支撐文件事務。
這裡說說為何有如許的需求吧:今朝須要一個項目用SSIS做數據遷徙,個中很年夜部門都是用sql語句完成的, 如 insert into ....select ... from xxxx.個中原數據庫中不免有甚麼髒數據招致拔出掉敗,因而我在SSIS中應用msdtc辦事,包管數據的分歧性。固然SSIS也有毛病處置,然則它只能記載誰人sql語句有成績,而不克不及記載詳細成績。因而我想到把毛病信念記載報數據庫內外面,可是當碰到成績時勢務會回滾,內外面基本就沒有毛病信息。因而乎 只能報毛病信息記載到文件中了。
如:
有纰謬的處所還請年夜家拍磚哦!