如何将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语句有问题,而不能记录具体问题。于是我想到把错误信心记录报数据库表里面,可是当遇到问题时事务会回滚,表里面根本就没有错误信息。于是乎 只能报错误信息记录到文件中了。

如:

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

时间: 2024-09-27 18:43:24

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

关于SQL执行计划错误导致临时表空间不足的问题_oracle

故障现象:临时表空间不足的问题已经报错过3次,客户也烦了,前两次都是同事添加5G的数据文件,目前已经达到40G,占用临时表空间主要是distinct 和group by 以及Union all 表数据量在200W左右,也不至于把40G的临时表空间撑爆. 原因分析:既然排序用不了这么多临时表空间应该是别的原因造成. 从包含故障时间段的AWR报告中可以看出这一阶段DBtime蛮高的,并且sql execute elapsed time 竟然占到了99.43%,可以断定是SQL语句引起的. 通过TOP

sql-bulk insert在SQL 2008中执行正确,但在MyEclipse中执行出现错误

问题描述 bulk insert在SQL 2008中执行正确,但在MyEclipse中执行出现错误 bulk insert在SQL 2008中执行正确,但在MyEclipse中执行出现错误:由于无法打开文件 "e:2.txt",无法进行大容量加载.操作系统错误代码为 123(文件名.目录名或卷标语法不正确). (1)下面是SQL里执行代码 bulk insert Book from 'e:2.txt' with ( fieldterminator = ' ', rowterminato

Sql Server 代理错误日志知多少

  一 概述 默认情况下,SQL Server 代理创建错误日志来记录警告和错误.日志中显示下列警告和错误: 警告消息,提供有关潜在问题的信息,例如"作业 在执行时被删除". 错误消息,通常需要系统管理员干预,例如"无法启动邮件会话".可以通过 net send 将错误消息发送给特定用户或计算机. 默认情况下,执行跟踪消息不写入 SQL Server代理日志错误,因为它们会将日志填满.如果错误日志已满,会降低选择和分析更严重的错误的能力.因为日志会增加服务器的处理负

perl-net-snmp安装成功后执行mib2c错误

问题描述 net-snmp安装成功后执行mib2c错误 安装后net-snmp后,执行mib2c命令,结果如下: [root@0 mibs]# pwd /media/disk2/loongson/netsnmp/net-snmpinstall/share/snmp/mibs [root@0 mibs]# mib2c -bash: /usr/local/bin/mib2c: 没有那个文件或目录 可能是perl工具有问题,又到源码目录下执行下面命令,也有错误.提示没有按照net-snmp-confi

ls-关于linux命令错误消息重定向

问题描述 关于linux命令错误消息重定向 这条命令ls /home/ha/a | awk '{doSomething}' 我现在想做到这种效果,如果/home/ha/a目录不存在,将错误消息输出到特定文件,但是 这个错误消息我想插入一些自己的内容,比如时间. 我知道这样做 ls /home/ha/a 2>file | awk '{doSomething}',也可以将错误消息 输出到文件,但是,这个错误消息是系统产生的,没有我自己的内容.我的意思就是说我想在这个错误消息里插入一些自己的内容.不知

_awr_sql_child_limit是否能控制awr记录sql执行次数的问题

在ACOUG中国行长沙站的活动上分亨了一个关于high version count的主题,在活动中老盖提到在AWR报告的SQL ordered by Version Count部分,当SQL的version count大于等于200时就不会记录SQL的Executions,但是今天在优化SQL时仔细观察了一下情况并不是这样.以下是10.2.0.4的一个AWR报告的SQL ordered by Version Count 下面是11.2.0.1.0的一个AWR报告的SQL ordered by V

在SQL Server的try...catch语句中获取错误消息代码的的语句

本文为大家详细介绍下如何在SQL Server的try...catch语句中获取错误消息的代码,具体示例如下,感兴趣的朋友可以参考下哈,希望对大家有所帮助   复制代码 代码如下: BEGIN TRY ... ... END TRY BEGIN CATCH DECLARE @ErrorMessage NVARCHAR(4000); DECLARE @ErrorSeverity INT; DECLARE @ErrorState INT; SELECT @ErrorMessage = ERROR_M

为什么ASP中执行动态SQL总报错误信息?提示语句语法错误_数据库相关

问:为什么ASP中执行动态SQL总报错误信息?提示语句语法错误 答: 有时候写ASP用conn.execute(sql)查询.更新.插入Access数据库数据时,明明正确的语句却往往会显示sql语句错误,相当恼火,特进行了归纳,可适当为字段添加"["."]"解决: 复制代码 代码如下: 例1:select * from a  如出现错误,可改为:select * from [a]  例2:UPDATE [user] SET password = '"&am

如何获得 sqlExec执行SQL脚本 的错误信息

问题描述 如何获得 sqlExec执行SQL脚本 的错误信息 SQLExec sqlExec = new SQLExec(); //设置数据库参数 sqlExec.setDriver("oracle.jdbc.driver.OracleDriver"); sqlExec.setUrl("jdbc:oracle:thin:@10.128.x.x:1521:xxsid"); sqlExec.setUserid("xxuser"); sqlExec.s