如何将sql执行的错误消息记录到本地文件中实现过程

时间:2024-01-22 06:50:37 

其实大家都知道sql语句的错误信息都可以在sys.messages表里面找到

如:

如何将sql执行的错误消息记录到本地文件中实现过程

如果在执行语句在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执行的错误消息记录到本地文件中实现过程

现在我们来定义一个存储过程,其目的就是往本地文件中写入信息。

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执行的错误消息记录到本地文件中实现过程

需要执行以下SQL:


go
sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO
sp_configure 'Ole Automation Procedures', 1;
GO
RECONFIGURE;
GO


运行即如果如图:

如何将sql执行的错误消息记录到本地文件中实现过程

当然这里运行存储过程之前必须保证 文件是存在的。

最后封装一个存储过程获取错误信息,其脚本如下:


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


执行存储过程及结果如下:
如何将sql执行的错误消息记录到本地文件中实现过程

如何将sql执行的错误消息记录到本地文件中实现过程

以上存储过程在MSSQL2005、2012中测试通过。

大家都知道目前在文件系统中事务的实现还是比较复杂的,虽然在win7后我们可以用C#实现文件的事务,但是微软的分布式事务Distributed Transaction Coordinator(msdtc)目前也还不支持文件事务。

这里说说为什么有这样的需求吧:目前需要一个项目用SSIS做数据迁移,其中很大部分都是用sql语句实现的, 如 insert into ....select ... from xxxx.其中原数据库中难免有什么脏数据导致插入失败,于是我在SSIS中使用msdtc服务,保证数据的一致性。虽然SSIS也有错误处理,但是它只能记录那个sql语句有问题,而不能记录具体问题。于是我想到把错误信心记录报数据库表里面,可是当遇到问题时事务会回滚,表里面根本就没有错误信息。于是乎 只能报错误信息记录到文件中了。

如:

如何将sql执行的错误消息记录到本地文件中实现过程

如何将sql执行的错误消息记录到本地文件中实现过程

如何将sql执行的错误消息记录到本地文件中实现过程

如何将sql执行的错误消息记录到本地文件中实现过程

有不对的地方还请大家拍砖哦!

标签:sql错误,本地文件
0
投稿

猜你喜欢

  • Python Pandas读取Excel日期数据的异常处理方法

    2021-12-10 11:22:55
  • python实现双人五子棋(终端版)

    2022-08-26 14:28:57
  • IE在DOM操作有表单控件时的bug

    2008-08-21 13:00:00
  • Python使用Asyncio实现检查网站状态

    2023-01-23 18:56:39
  • python用装饰器自动注册Tornado路由详解

    2021-07-16 07:53:37
  • Vue $emit()不能触发父组件方法的原因及解决

    2024-05-28 16:10:26
  • spring boot整合mybatis使用c3p0数据源连接mysql

    2024-01-25 08:13:15
  • 基于python3抓取pinpoint应用信息入库

    2021-08-05 12:21:02
  • 微信小程序module.exports模块化操作实例浅析

    2023-07-02 05:30:27
  • python多进程实现文件下载传输功能

    2022-06-27 02:22:41
  • Oracle 中文字段进行排序的sql语句

    2009-09-26 18:58:00
  • pytorch中关于distributedsampler函数的使用

    2023-01-18 01:10:01
  • JavaScript门道之标准库

    2024-06-05 09:53:21
  • jQuery获取radio选中项的值实例

    2024-04-09 19:45:16
  • 21行Python代码实现拼写检查器

    2023-10-11 03:33:03
  • Python获取百度热搜的完整代码

    2023-09-06 11:33:32
  • python利用pd.cut()和pd.qcut()对数据进行分箱操作

    2022-03-26 07:57:45
  • 关于Python网络爬虫requests库的介绍

    2021-10-20 23:13:52
  • 通过实例了解JS 连续赋值

    2024-05-02 16:15:14
  • 好用的Python编辑器WingIDE的使用经验总结

    2022-01-15 06:23:10
  • asp之家 网络编程 m.aspxhome.com