您的位置:首页 > 其它

一个将数据导出到EXCEL的存储过程

2008-04-26 18:11 501 查看
/*--数据导出EXCEL

导出查询中的数据到,包含字段名,文件为真正的EXCEL文件
,如果文件不存在,将自动创建文件
,如果表不存在,将自动创建表
基于通用性考虑,仅支持导出标准数据类型
作者:邹建
--*/

/*--调用示例

p_exporttb@sqlstr='select*from地区资料'
,@path='c:/',@fname='aa.xls',@sheetname='地区资料'
--*/

createprocp_exporttb
@tbnamesysname, --要导出的表名
@pathnvarchar(1000), --文件存放目录
@fnamenvarchar(250)='' --文件名,默认为表名
as
declare@errint,@srcnvarchar(255),@descnvarchar(255),@outint
declare@objint,@constrnvarchar(1000),@sqlvarchar(8000),@fdlistvarchar(8000)

--参数检测
ifisnull(@fname,'')=''set@fname=@tbname+'.xls'

--检查文件是否已经存在
ifright(@path,1)<>''set@path=@path+''
createtable#tb(abit,bbit,cbit)
set@sql=@path+@fname
insertinto#tbexecmaster..xp_fileexist@sql

--创建语句
set@sql=@path+@fname
ifexists(select1from#tbwherea=1)
set@constr='DRIVER={MicrosoftEXCELDriver(*.xls)};DSN='''';READONLY=FALSE'
+';CREATE_DB="'+@sql+'";DBQ='+@sql
else
set@constr='Provider=Microsoft.Jet.OLEDB.4.0;ExtendedProperties="EXCEL8.0;HDR=YES'
+';DATABASE='+@sql+'"'

--连接数据库
exec@err=sp_oacreate'adodb.connection',@objout
if@err<>0gotolberr

exec@err=sp_oamethod@obj,'open',null,@constr
if@err<>0gotolberr

/*--如果覆盖已经存在的表,就加上下面的语句
--创建之前先删除表/如果存在的话
select@sql='droptable['+@tbname+']'
exec@err=sp_oamethod@obj,'execute',@outout,@sql
--*/

--创建表的SQL
select@sql='',@fdlist=''
select@fdlist=@fdlist+',['+a.name+']'
,@sql=@sql+',['+a.name+']'
+casewhenb.namein('char','nchar','varchar','nvarchar')then
'text('+cast(casewhena.length>255then255elsea.lengthendasvarchar)+')'
whenb.namein('tynyint','int','bigint','tinyint')then'int'
whenb.namein('smalldatetime','datetime')then'datetime'
whenb.namein('money','smallmoney')then'money'
elseb.nameend
FROMsyscolumnsaleftjoinsystypesbona.xtype=b.xusertype
whereb.namenotin('image','text','uniqueidentifier','sql_variant','ntext','varbinary','binary','timestamp')
andobject_id(@tbname)=id
select@sql='createtable['+@tbname
+']('+substring(@sql,2,8000)+')'
,@fdlist=substring(@fdlist,2,8000)
exec@err=sp_oamethod@obj,'execute',@outout,@sql
if@err<>0gotolberr

exec@err=sp_oadestroy@obj

--导入数据
set@sql='openrowset(''MICROSOFT.JET.OLEDB.4.0'',''EXCEL8.0;HDR=YES
;DATABASE='+@path+@fname+''',['+@tbname+'$])'

exec('insertinto'+@sql+'('+@fdlist+')select'+@fdlist+'from'+@tbname)

return

lberr:
execsp_oageterrorinfo0,@srcout,@descout
lbexit:
selectcast(@errasvarbinary(4))as错误号
,@srcas错误源,@descas错误描述
select@sql,@constr,@fdlist

GO

========================================
NinGoo注:
EXCEL文件每个工作表不能超过65536条记录

解决办法:1
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: