热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

SQL大容量数据导出到Excel(多文件单SHeet)

CodeCREATEprocsqlToMultiExcelFilesqlstrnvarchar(4000),--查询语句,如果查询语句中使用了orderby,请加上top100pe

 

ContractedBlock.gifExpandedBlockStart.gifCode
CREATE proc  sqlToMultiExcelFile
@sqlstr nvarchar(4000),    --查询语句,如果查询语句中使用了order by ,请加上top 100 percent  
@primaryKey varchar(100),--分页主键字段
@path nvarchar(1000),   --文件存放目录  
@fname nvarchar(250),   --文件名  
@sheetname varchar(250)='sheet1'  --要创建的工作表名,默认为文件名  
as   
set nocount on
declare @err int,@src nvarchar(255),@out int,@desc nvarchar(255),@sheetCount int,@i int,@topCount int,@where varchar(1000),@from varchar(1000),@myWhere varchar(1000),@filename varchar(250)
declare @obj int,@constr nvarchar(1000),@sql varchar(8000),@fdlist varchar(8000),@totalCount int,@pageCount int  
create table #tbMemory
(
 recId 
int identity(1,1primary key,
 primaryKey 
varchar(50)
)
create table #pageTb(totalCount int)


set @from=substring(@sqlstr,charindex('from',@sqlstr)+5,len(@sqlstr)-charindex('from',@sqlstr)+1)


if charindex('where',@sqlstr)>0
 
set @where=substring(@sqlstr,charindex('where',@sqlstr)+6,len(@sqlstr)-charindex('where',@sqlstr)+1)
else
 
set @where=''


set @pageCount=65000
set @sql='select count(*) from ('+@sqlStr+') a'

insert into #pageTb execute (@sql)
select @totalCount=totalCount from #pageTb

insert into #tbMemory execute('select top '+@totalCount+' '+@primaryKey+' from '+@from)

--得出要导出的sheet数量
if @totalCount>@pageCount 
 
set @sheetCount=@totalCount/@pageCount+1
else
 
set @sheetCount=1

--参数检测  
if isnull(@fname,'')='' set @fname='temp.xls'  
if isnull(@sheetname,'')='' set @sheetname=replace(@fname,'.','#')  
  
--检查文件是否已经存在  
if right(&#64;path,1)<>&#39;\&#39; set &#64;path&#61;&#64;path&#43;&#39;\&#39;  
create table #tb(a bit,b bit,c bit)  

  

--创建表的SQL  
declare &#64;tbname sysname  
set &#64;tbname&#61;&#39;##tmp_&#39;&#43;convert(varchar(38),newid())  
set &#64;sql&#61;&#39;select top 1 * into [&#39;&#43;&#64;tbname&#43;&#39;] from(&#39;&#43;&#64;sqlstr&#43;&#39;) a&#39;  
--print &#64;sql  
exec(&#64;sql)  
 

select &#64;sql&#61;&#39;&#39;,&#64;fdlist&#61;&#39;&#39;  
select &#64;fdlist&#61;&#64;fdlist&#43;&#39;,[&#39;&#43;a.name &#43;&#39;]&#39;
 ,
&#64;sql&#61;&#64;sql&#43;&#39;,[&#39;&#43;a.name&#43;&#39;&#39;  
  
&#43;case when b.name in(&#39;char&#39;,&#39;nchar&#39;,&#39;varchar&#39;,&#39;nvarchar&#39;then  
     
&#39;text(&#39;&#43;cast(case when a.length>255 then 255 else a.length end as varchar)&#43;&#39;)&#39;  
   
when b.name in(&#39;tynyint&#39;,&#39;int&#39;,&#39;bigint&#39;,&#39;tinyint&#39;then &#39;int&#39;  
   
when b.name in(&#39;smalldatetime&#39;,&#39;datetime&#39;then &#39;datetime&#39;  
   
when b.name in(&#39;money&#39;,&#39;smallmoney&#39;then &#39;money&#39;  
   
else b.name end  
FROM tempdb..syscolumns a left join tempdb..systypes b on a.xtype&#61;b.xusertype  
where b.name not in(&#39;image&#39;,&#39;text&#39;,&#39;uniqueidentifier&#39;,&#39;sql_variant&#39;,&#39;ntext&#39;,&#39;varbinary&#39;,&#39;binary&#39;,&#39;timestamp&#39;)  
 
and a.id&#61;(select id from tempdb..sysobjects where name&#61;&#64;tbname)  

--创建sheet语句
set &#64;sql&#61;&#39;create table [&#39;&#43;&#64;sheetname&#43;&#39;](&#39;&#43;substring(&#64;sql,2,8000)&#43;&#39;)&#39; 

set &#64;i&#61;1
while &#64;i<&#61;&#64;sheetCount
begin
 
set &#64;filename&#61;&#64;path&#43;cast(&#64;i as varchar)&#43;&#64;fname  
 
truncate table #tb
 
insert into #tb exec master..xp_fileexist &#64;filename

 
if exists(select 1 from #tb where a&#61;1)  
   
set &#64;constr&#61;&#39;DRIVER&#61;{Microsoft Excel Driver (*.xls)};DSN&#61;&#39;&#39;&#39;&#39;;READONLY&#61;FALSE;CREATE_DB&#61;"&#39;&#43;&#64;filename&#43;&#39;";DBQ&#61;&#39;&#43;&#64;filename
 
else  
   
set &#64;constr&#61;&#39;Provider&#61;Microsoft.Jet.OLEDB.4.0;Extended Properties&#61;"Excel 8.0;HDR&#61;YES;DATABASE&#61;&#39;&#43;&#64;filename&#43;&#39;"&#39;   
  

 
--创建Excel文件
 exec &#64;err&#61;sp_oacreate &#39;adodb.connection&#39;,&#64;obj out  
 
if &#64;err<>0 goto lberr  
  
 
exec &#64;err&#61;sp_oamethod &#64;obj,&#39;open&#39;,null,&#64;constr  
 
if &#64;err<>0 goto lberr    
 
 
exec &#64;err&#61;sp_oamethod &#64;obj,&#39;execute&#39;,&#64;out out,&#64;sql  
 
if &#64;err<>0 goto lberr    
 
 
--关闭Excel
 exec   &#64;err&#61;sp_oamethod   &#64;obj,&#39;close&#39;,null     
 
if   &#64;err<>0   goto   lberr  
  
 
exec &#64;err&#61;sp_oadestroy &#64;obj 
 
 
set &#64;i&#61;&#64;i&#43;1  
end

 

set &#64;fdlist&#61;substring(&#64;fdlist,2,8000)  

set &#64;i&#61;1

--导入数据  
while &#64;i<&#61;&#64;sheetCount
begin
 
set &#64;topCount&#61;(&#64;i-1)*&#64;pageCount 
 
--可取记录小于页面所需数时取剩余记录
    if &#64;totalCount-&#64;topCount<&#64;pageCount
        
set &#64;pageCount&#61;&#64;totalCount-&#64;topCount

 
if &#64;where<>&#39;&#39;
 
begin
  
set &#64;myWhere&#61;&#39;z1.recId >&#39;&#43;cast(&#64;topCount as varchar)&#43;&#39; and &#39;&#43;&#64;where
  
set &#64;sql&#61;&#39;select top &#39;&#43;convert(varchar,&#64;pageCount)&#43;&#39; &#39;&#43;&#64;fdlist&#43;&#39; from &#39;&#43;substring(&#64;from,1,charindex(&#39;where&#39;,&#64;from)-2)

 
end
 
else
 
begin
  
set &#64;myWhere&#61;&#39;z1.recId >&#39;&#43;cast(&#64;topCount as varchar)
  
set &#64;sql&#61;&#39;select top &#39;&#43;convert(varchar,&#64;pageCount)&#43;&#39; &#39;&#43;&#64;fdlist&#43;&#39; from &#39;&#43;&#64;from
 
end
 
 
set &#64;sql&#61;&#64;sql&#43;&#39; left join #tbMemory z1 on &#39;&#43;&#64;primaryKey&#43;&#39;&#61;primaryKey where &#39;&#43;&#64;myWhere

 
set &#64;constr&#61;&#39;openrowset(&#39;&#39;MICROSOFT.JET.OLEDB.4.0&#39;&#39;,&#39;&#39;Excel 8.0;HDR&#61;YES;DATABASE&#61;&#39;&#43;&#64;path&#43;cast(&#64;i as varchar)&#43;&#64;fname&#43;&#39;&#39;&#39;,[&#39;&#43;&#64;sheetname&#43;&#39;$])&#39;

-- set ansi_nulls on
--
 set ansi_warnings on
 
 
--print &#64;sql
 execute(&#39;insert into &#39;&#43;&#64;constr&#43;&#39;(&#39;&#43;&#64;fdlist&#43;&#39;&#39;&#43;&#64;sql)

 
set &#64;i&#61;&#64;i&#43;1
end

set &#64;sql&#61;&#39;drop table [&#39;&#43;&#64;tbname&#43;&#39;]&#39;  
exec(&#64;sql)  


--set ansi_nulls off 
--
set ansi_warnings off

return  
  
lberr:  
 
exec sp_oageterrorinfo 0,&#64;src out,&#64;desc out  
lbexit:  
 
select cast(&#64;err as varbinary(4)) as 错误号  
  ,
&#64;src as 错误源,&#64;desc as 错误描述  
 
select &#64;sql,&#64;constr,&#64;fdlist
GO

转:https://www.cnblogs.com/xiaobier/archive/2009/05/19/1460237.html



推荐阅读
  • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
  • ALTERTABLE通过更改、添加、除去列和约束,或者通过启用或禁用约束和触发器来更改表的定义。语法ALTERTABLEtable{[ALTERCOLUMNcolu ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • 本文介绍了游标的使用方法,并以一个水果供应商数据库为例进行了说明。首先创建了一个名为fruits的表,包含了水果的id、供应商id、名称和价格等字段。然后使用游标查询了水果的名称和价格,并将结果输出。最后对游标进行了关闭操作。通过本文可以了解到游标在数据库操作中的应用。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 本文介绍了三种方法来实现在Win7系统中显示桌面的快捷方式,包括使用任务栏快速启动栏、运行命令和自己创建快捷方式的方法。具体操作步骤详细说明,并提供了保存图标的路径,方便以后使用。 ... [详细]
  • Python SQLAlchemy库的使用方法详解
    本文详细介绍了Python中使用SQLAlchemy库的方法。首先对SQLAlchemy进行了简介,包括其定义、适用的数据库类型等。然后讨论了SQLAlchemy提供的两种主要使用模式,即SQL表达式语言和ORM。针对不同的需求,给出了选择哪种模式的建议。最后,介绍了连接数据库的方法,包括创建SQLAlchemy引擎和执行SQL语句的接口。 ... [详细]
  • 在Oracle11g以前版本中的的DataGuard物理备用数据库,可以以只读的方式打开数据库,但此时MediaRecovery利用日志进行数据同步的过 ... [详细]
  • 本文介绍了使用哈夫曼树实现文件压缩和解压的方法。首先对数据结构课程设计中的代码进行了分析,包括使用时间调用、常量定义和统计文件中各个字符时相关的结构体。然后讨论了哈夫曼树的实现原理和算法。最后介绍了文件压缩和解压的具体步骤,包括字符统计、构建哈夫曼树、生成编码表、编码和解码过程。通过实例演示了文件压缩和解压的效果。本文的内容对于理解哈夫曼树的实现原理和应用具有一定的参考价值。 ... [详细]
author-avatar
食品质量的安全
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有