≡
  • 网络编程
  • 数据库
  • CMS技巧
  • 软件编程
  • PHP笔记
  • JavaScript
  • MySQL
位置:首页 > 数据库 > SQL Server

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

人气:349 时间:2020-03-11

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

如:

【图片暂缺】

【图片暂缺】

【图片暂缺】

【图片暂缺】

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

本文来自:http://www.q1010.com/179/8449-0.html

注:关于如何将sql执行的错误消息记录到本地文件中实现过程的内容就先介绍到这里,更多相关文章的可以留意四海网的其他信息。

关键词:SQL SERVER

您可能感兴趣的文章

  • 浅析SQLServer中的Scanf与Printf
  • 解析SQLServer获取Excel中所有Sheet的方法
  • SQLSERVER数据库备份后无法还原的解决办法
  • 浅析被遗忘的SQLServer比较运算符修饰词
  • sqlserver 存储过程中If Else的用法实例
  • SQL Server 将ACCESS数据库迁移到SQLSERVER数据库两种方法
  • SQL Server 使用mongovue把sqlserver数据导入mongodb的简单示例
  • SQL Server driver配置方法 jdbc连接sqlserver的简单示例
  • SQL Server 查找查询死锁源头的方法 sqlserver死锁监控
  • Linux环境中使用BIEE 连接SQLServer业务数据源的简单示例
上一篇:基于SQL Server中char,nchar,varchar,nvarchar的使用区别
下一篇:sql 游标的使用—游标FOR循环小例子
热门文章
  • SQL Server SQL获取第一条记录的方法
  • SQL Server出现System.OutOfMemoryException异常的解决方法
  • SQL Server的 update from 语句的简单示例
  • SQL Server 数据库备份方法菜鸟教程
  • SQL Server 多表关联时在where语句中慎用trim()方法
  • SQL Server数据类型及长度限制详细说明
  • mybaits非配置原因,导致SqlSession was not registered for synchronization异常解析
  • SQL Server 收缩后对数据库的使用有影响吗?
  • SQL Server 格式导致的Excel导入sql出现异常的解决方法
  • SQL Server 连接服务器出现错误 7391的解决方法
  • 最新文章
    • SQL Server存储过程基本语法的简单示例
    • sql查询时增加自动编号和分页的简单示例
    • sql轻松应付百万数据的高效数据分页存储过程的简单示例
    • sql获取一条数据中所有字段的名称和值的实现方法
    • sql分割函数的简单示例
    • SQL Server异常捕获的简单示例
    • SQL SERVER回滚恢复误操作数据的实现方法
    • SQL Server函数或存储过程中抛出异常的实现方法
    • SQL Server创建数据库的完整代码
    • SQL Server创建数据库的命令用法示例

四海网收集整理一些常用的php代码,JS代码,数据库mysql等技术文章。