将SQL SERVER2000表中的数据导出到EXCEL中,使用存储过程实现,如何包含字段名?搜索到邹建写的存储过程如下,没有看明白,执行时报错“错误号0x80004005,错误源Microsoft JET Database Engine,错误描述:找不到可安装的ISAM”,各位帮忙看看这个存储过程是否完全正确,如何解决这个错误,谢谢!
调用存储过程如下:exec p_exporttb   @sqlstr= 'select   *   from con_config' 
,@path= 'e:\ ',@fname= 'con_config.xls ',@sheetname= 'con_config' 
存储过程定义如下:/*--数据导出EXCEL 导出查询中的数据到Excel,包含字段名,文件为真正的Excel文件 
,如果文件不存在,将自动创建文件 
,如果表不存在,将自动创建表 
基于通用性考虑,仅支持导出标准数据类型 
--邹建   2003.10--*/ /*--调用示例 p_exporttb   @sqlstr= 'select   *   from   地区资料 ' 
,@path= 'c:\ ',@fname= 'aa.xls ',@sheetname= '地区资料 ' 
--*/ 
if   exists   (select   *   from   dbo.sysobjects   where   id   =   object_id(N '[dbo].[p_exporttb] ')   and   OBJECTPROPERTY(id,   N 'IsProcedure ')   =   1) 
drop   procedure   [dbo].[p_exporttb] 
GO create   proc   p_exporttb 
@sqlstr   sysname, --查询语句,如果查询语句中使用了order   by   ,请加上top   100   percent 
@path   nvarchar(1000), --文件存放目录 
@fname   nvarchar(250), --文件名 
@sheetname   varchar(250)= ' ' --要创建的工作表名,默认为文件名 
as   
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=@path+ '\ ' 
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   5.0;HDR=YES ' 
+ ';DATABASE= '+@sql+ ' " ' --连接数据库 
exec   @err=sp_oacreate   'adodb.connection ',@obj   out 
if   @err <> 0   goto   lberr exec   @err=sp_oamethod   @obj, 'open ',null,@constr 
if   @err <> 0   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   @err <> 0   goto   lberr exec   @err=sp_oadestroy   @obj --导入数据 
set   @sql= 'openrowset( ' 'MICROSOFT.JET.OLEDB.4.0 ' ', ' 'Excel   5.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 

解决方案 »

  1.   

    目前数据库安装在windows server 2008,服务器上没有安装office,程序中的execl版本必须是服务器上的excel么?
      

  2.   

    已经安装了office 2007,重新执行还是报同样错误,office 2007对应的时Excel 5.0么?0x80004005 Microsoft JET Database Engine 找不到可安装的 ISAM。存储过程中调用excel驱动语句如下: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 5.0;HDR=YES;DATABASE= '+@sql+ ' " ' 
      

  3.   

    在论坛中找了一个遇到相似问题的贴子,用邹建的代码从sql server 2000生成excel文件时,也遇到“找不到可安装的 ISAM”问题,尝试按照回帖人的答复更改了“if exists(select 1 from #tb where a=0)”,但是错误变为“未发现数据源名称并且未指定默认驱动程序”,数据库服务器上安装的是office 2007,由于项目进度比较紧,各位大牛帮忙看下,先谢谢了!帖子地址:http://topic.csdn.net/u/20100510/11/da99f05d-a5ed-4afa-b068-0d2b35ce024f.html 
    解决方案在12楼
      

  4.   

    直接用sql自带的导入导出引导,导出时勾上好像是叫“包含首行”还是啥来着。
    很简单的。
      

  5.   

    更改后代码:set   @sql=@path+@fname 
    if   exists(select   1   from   #tb   where   a=0) 
    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 5.0;HDR=YES;DATABASE= '+@sql+ ' " ' 
      

  6.   

    主要是将表中每个预测日期字段值(从20080101到20110817)对应的记录分别写到不同的excel文件中,有近一千个文件,所以只能使用存储过程来实现。
      

  7.   

    下载一个最新版本的MDAC 装上