一个将数据导出到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
导出查询中的数据到,包含字段名,文件为真正的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
相关文章推荐
- 一个将数据导出到EXCEL的存储过程
- 一个将数据导出到EXCEL的存储过程
- 一个将数据导出到EXCEL的存储过程-数据库专栏,SQL Server
- 使用CLR存储过程方便快捷导出数据到Excel 【转】
- SQL SERVER 数据导出EXCEL 的存储过程
- Oracle采用存储过程执行sql语句,将查询到的数据导出到EXCEL中
- 使用CLR存储过程方便快捷导出数据到Excel
- 利用存储过程将Excel中数据导入到数据库表中
- 一个将数据分页的存储过程
- 配置ODBC DSN数据源,导出数据库数据到Excel过程记录
- Sql存储查询数据导出Excel文件(注意:有几百万条数据)
- datagridview中的数据导出到excel过程
- 发布一个通用的数据分页的存储过程(转载)
- SQL SERVER:把表里的数据导出成为INSERT INTO脚本的存储过程
- 一个通用的数据分页的存储过程
- 如何建立一个灵活的、可配置的导出数据到Excel的解决方案。
- SQL 导出表数据存储过程
- 存储过程导入、导出excel(转自邹老大博客)
- 一个高效的数据分页的存储过程
- 一个循环插入数据到数据库的存储过程