程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> 其他數據庫知識 >> MSSQL >> 若何將sql履行的毛病新聞記載到當地文件中完成進程

若何將sql履行的毛病新聞記載到當地文件中完成進程

編輯:MSSQL

若何將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語句有成績,而不克不及記載詳細成績。因而我想到把毛病信念記載報數據庫內外面,可是當碰到成績時勢務會回滾,內外面基本就沒有毛病信息。因而乎 只能報毛病信息記載到文件中了。

如:

有纰謬的處所還請年夜家拍磚哦!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved