当前位置:  数据库>sqlserver

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

    来源: 互联网  发布时间:2014-10-11

    本文导语:  其实大家都知道sql语句的错误信息都可以在sys.messages表里面找到 如: 如果在执行语句在try...catch中 我们可以通过以下方法获取错误信息。sql语句如下: 代码如下:BEGIN TRY SELECT 3 / 0 END TRY BEGIN CATCH DECLARE @errornumber INT DECLARE @errors...

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

如:

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


    
 
 

您可能感兴趣的文章:

  • Oracle SQL中实现indexOf和lastIndexOf功能的思路及代码
  • ms sql server中实现的unix时间戳函数(含生成和格式化,可以和mysql兼容)
  • sql server中实现一个Split表函数
  • sql server中实现行转列的代码
  • 如何在SQL Server中实现 Limit m,n 的功能
  • 如何在T-sql 中实现数组的功能
  • sql server中实现二进制与字符类型之间的数据转换
  • SQL Server中实现二进制与字符类型之间的数据转换
  • 在SQL Server中实现最短路径搜索的解决方法
  • SQL Server统计SQL语句执行时间的脚本
  • 怎么写一个Shell来执行这样的功能,访问Oracle数据库,然后执行一个SQL脚本,生成一个文件。急!
  • SQL Server 中查看SQL句子执行所用的时间
  • oracle导出sql语句的结果集和保存执行的sql语句(深入分析)
  • c/c++开源软件 iis7站长之家
  • 如何处理此错误:java.sql.SQLException: [Microsoft][ODBC SQL Server Driver]没有执行可选特性
  • sql无效字符引起的执行sql语句报错的解决方法
  • C#代码验证sql语句是否正确(只验证不执行sql)的方法
  • 为什么 java.sql.SQLException: [Microsoft][ODBC SQL Server Driver]没有执行可选特性
  • sql无效字符 执行sql语句报错解决方案
  • 如何判断一条sql(update,delete)语句是否执行成功
  • Java的SQL语句执行错误问题
  • 请问如何在Java中执行SQL的块语句?
  • 当ResultSet执行SQL成功后,我如何取得ResultSet的记录部条数
  • 了解 sql server 语句的执行时间
  • oracle sql执行过程(流程图)
  • jsp中sql语句执行时间太长,用浏览器打开时,页面超时,如何处理?
  • ~~进门就送分!~~ 如何执行包含多语种的SQL语句呢?
  • oracle中得到一条SQL语句的执行时间的两种方式
  • SQL语句执行顺序图文介绍
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • SQL Server"错误 21002: [SQL-DMO]用户 * 已经存在问题解决
  • sql2005 create file遇到操作系统错误5拒绝访问 错误1802
  • 请问,这是什么错误!java.sql.SQLException: [Microsoft][ODBC SQL Server Driver][Named Pipes]??????? SQL Server?虽然分少,但一定给,只要您是前5名回复者中最好的以为!
  • 在jsp中做页面登录,出现错误信息“数据库执行错误:No suitable driver”,我怀疑是不是我不能用sql 7.0
  • Microsoft SQL Server 2005 错误 29503 的解决方法
  • 清除SQL SERVER错误日志出现操作系统错误的解决方法
  • SQL Server 2005 还原数据库错误解决方法
  • sql="insert into fr0"+"values ('4','name');";怎么老有错误?
  • sql 约束性错误要注意的问题及其它
  • Sql语句的错误(在线给分)
  • SQL Server导入导出数据时最常见的一个错误解决方法
  • 在oracle 数据库中查看一个sql语句的执行时间和SP2-0027错误
  • sql server 2005删除用户时“数据库主体在该数据库中拥有架构,无法删除”错误的解决办法
  • 请问 错误:java.sql.SQLException: Exhausted Resultset
  • 在SQL Server的try...catch语句中获取错误消息代码的的语句
  • sql server 2005 附加数据库出错(错误号:5123)的解决方法
  • 高分求助,出现SQL的错误,是怎么回事?
  • java.sql.SQLException: 内部错误: Unable to construct a Datum from the specified input
  • 用SQL语句实现随机查询数据并不显示错误数据的方法
  • SQL Server 2000“设备激活错误”的解决方法
  • java命名空间java.sql接口statement的类成员方法: executeupdate定义及介绍
  • SQL查询分析工具 SQL Workbench/J
  • java命名空间java.sql接口connection的类成员方法: nativesql定义及介绍
  • SQL客户端软件 PKLite SQL Client
  • java命名空间java.sql接口preparedstatement的类成员方法: executeupdate定义及介绍
  • SQL语句实现SQL Server 2000及Sql Server 2005日志收缩(批量)
  • java命名空间java.sql接口rowid的类成员方法: getbytes定义及介绍
  • SQL客户端管理工具 SQuirreL SQL Client
  • java命名空间java.sql接口ref的类成员方法: getbasetypename定义及介绍
  • sql2005 大数据量检索分页的sql代码
  • java命名空间java.sql接口databasemetadata的类成员方法: getsqlkeywords定义及介绍


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3