xiguaqq20 发表于 2015-5-29 08:35:44

把SQL Server 错误日志导出为EXCEL 并发送到指定的ftp 或者 共享盘

/*
   2005版本 和2000 版本 sql server 错误日志结果不同。
   下面是 适用于 SQL2000的
   其中加入了 自己编写的一个ftp小程序 用来上传 相关日志状况
*/
IF object_id('tempdb..#error_log') IS NOT NULL
      DROP TABLE#error_log
go
--2000
CREATE TABLE #error_log(id INT IDENTITY(1,1), ErrorContent VARCHAR(8000),continueRow int)
insert INTO #error_log EXEC master.dbo.xp_readerrorlog   
UPDATEa SET ErrorContent = LEFT(b.ErrorContent,23) + a.ErrorContent
      FROM #error_log a
            INNER JOIN #error_log b ON a.id = b.id + a.continueRow
WHERE a.continueRow>0

DECLARE @str VARCHAR(8000)
SET @str= '
SELECT id,errorcontent,continuerow FROM #error_log WHERE ErrorContent LIKE   
CONVERT(VARCHAR(10),DATEADD(dd,-1,GETDATE()) ,120) +''%''
OR ErrorContent LIKE   CONVERT(VARCHAR(10),GETDATE() ,120) +''%'''
exec talkins.dbo.p_exporttb   @sqlstr= @str,@path= 'e:\fanr\temp ',@fname= 'SQLLog.xls' ,@sheetname ='log'
go
exec master..xp_cmdshell 'e:\fanr\temp\myftp.exe p e:\fanr\temp\ /fanr SQLLog.xls'
go
exec master..xp_cmdshell 'del e:\fanr\temp\SQLLog.xls'
  


  








/*--数据导出EXCEL
导出表中的数据到Excel,包含字段名,文件为真正的Excel文件
,如果文件不存在,将自动创建文件
,如果表不存在,将自动创建表
基于通用性考虑,仅支持导出标准数据类型
--邹建2003.10(引用请保留此信息)--*/
/*--调用示例
p_exporttb   @sqlstr= 'select * from t2 ',@path= 'd:\ ',@fname= 'a1.xls' ,@sheetname ='local2'
--*/   
create PROCEDURE p_exporttb (
@sqlstr   sysname, --查询语句,如果查询语句中使用了order   by   ,请加上top   100   percent,注意,如果导出表/视图,用上面的存储过程
@path   nvarchar(1000), --文件存放目录
@fname   nvarchar(250), --文件名
@sheetname   varchar(250)='' --要创建的工作表名,默认为文件名
)
as
--select @sqlstr= 'select * from t2 ',@path= 'd:\ ',@fname= 'a1.xls' ,@sheetname ='local'
declare   @err   int,@src   nvarchar(255),@desc   nvarchar(255),@out   int
declare   @obj   int,@constr   nvarchar(1000),@sql   varchar(8000),@fdlist   varchar(8000)
--参数检测
if   isnull(@fname,'')='' set   @fname='temp.xls'
if   isnull(@sheetname,'')=''   set   @sheetname=replace(@fname,'.','#')
--检查文件是否已经存在
if   right(@path,1)'\'   set   @path=RTRIM(@path)+'\'
IF object_id('tempdb..#tb') IS NOT NULL
      DROP TABLE #tb
create   table   #tb(a   bit,b   bit,c   bit)
set   @sql=@path+@fname
insert   into   #tb   exec   master..xp_fileexist   @sql
--数据库创建语句
set   @sql=@path+@fname
if   exists(select   1   from   #tb   where   a=1)
set   @constr='DRIVER={Microsoft Excel Driver (*.xls)};DSN='''';READONLY=FALSE'
          +';CREATE_DB="'+@sql+'";DBQ='+@sql
else
set   @constr='Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties="Excel 8.0;HDR=YES'
+';DATABASE='+@sql+'"'
--连接数据库
exec   @err=sp_oacreate   'adodb.connection',@obj   out
if   @err0   goto   lberr
exec   @err=sp_oamethod   @obj,'open',null,@constr
if   @err0   goto   lberr
--创建表的SQL
declare   @tbname   sysname
set   @tbname='##tmp_'+convert(varchar(38),newid())
set   @sql='select   *   into   ['+@tbname+']   from('+@sqlstr+')   a'
exec(@sql)
select   @sql='',@fdlist=''
select   @fdlist=@fdlist+','+a.name
,@sql=@sql+',['+a.name+']   '
+case   when   b.name   in('char','nchar','varchar','nvarchar')   then
    'text('+cast(case   when   a.length>255   then   255   else   a.length   end   as   varchar)+')'
when   b.name   in('tynyint','int','bigint','tinyint')   then   'int'
when   b.name   in('smalldatetime','datetime')   then   'datetime'
when   b.name   in('money','smallmoney')   then   'money'
else   b.name   end
FROM   tempdb..syscolumns   a   left   join   tempdb..systypes   b   on   a.xtype=b.xusertype
where   b.name   not   in('image','text','uniqueidentifier','sql_variant','ntext','varbinary','binary','timestamp')
and   a.id=(select   id   from   tempdb..sysobjects   where   name=@tbname)
select   @sql='create   table   ['+@sheetname
+']('+substring(@sql,2,8000)+')'
,@fdlist=substring(@fdlist,2,8000)
exec   @err=sp_oamethod   @obj,'execute',@out   out,@sql
if   @err0   goto   lberr
exec   @err=sp_oadestroy   @obj
--导入数据
set   @sql='openrowset(''MICROSOFT.JET.OLEDB.4.0'',''Excel 8.0;HDR=YES
;DATABASE='+@path+@fname+''',['+@sheetname+'$])'
exec('insert   into   '+@sql+'('+@fdlist+')   select   '+@fdlist+'   from   ['+@tbname+']')
set   @sql='drop   table   ['+@tbname+']'
exec(@sql)
return
lberr:
exec   sp_oageterrorinfo   0,@src   out,@desc   out
lbexit:
select   cast(@err   as   varbinary(4))   as   错误号
,@src   as   错误源,@desc   as   错误描述
select   @sql,@constr,@fdlist
GO
  
页: [1]
查看完整版本: 把SQL Server 错误日志导出为EXCEL 并发送到指定的ftp 或者 共享盘