mssql 2000 导出excel并分页

本文介绍了一种使用SQL Server存储过程批量导出数据到Excel的方法,包括处理大量数据时的分批导出策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

declare @add nvarchar(255)
declare @tb nvarchar(255)
set @tb='b1'
declare mycursor cursor for select zhen from shzhen
open mycursor
fetch next from mycursor into @add
while (@@fetch_status=0)
begin
    
declare @sqlstr nvarchar(255)
    
--print @add
    declare @sum int
    
declare @sumstr nvarchar(255)
    
set @sumstr='select @COUNT =count(*) from '+@tb+' where charindex('''+@add+''',address)>0'
    
execute sp_executesql  
              
@sumstr
              N
'@COUNT  int output'
              
@sum output   --获取总数量
    if @sum>16000
    
    
begin
        
        
declare @i int
        
set @i=1
        
declare @fstr nvarchar(50)
         
if object_id('test.dbo.tmptb'is not null drop table tmptb
        
exec('select * into tmptb from '+@tb+' where charindex('''+@add+''',address)>0')
        
            
while @sum>16000
            
begin
            
                
set @fstr=@add+cast(@i as varchar(10))
                
exec p_exporttb 'select top 16000 address,name,tel,zip from tmptb',
                
@path='e: emp',@fname=@fstr,@sheetname=@add
                
exec('delete tmptb where id in (select top 16000 id from tmptb)'--删除一个excel表的数据
                
                
                
set @sumstr='select @COUNT =count(*) from tmptb'
                
execute sp_executesql  
                          
@sumstr
                          N
'@COUNT  int output'
                          
@sum output   --获取总数量    
                print @i
                
set @i=@i+1        
    
            
end 

            
set @fstr=@add+cast(@i as varchar(10))
            
exec p_exporttb 'select  address,name,tel,zip from tmptb',
            
@path='e: emp',@fname=@fstr,@sheetname=@add
            
drop table tmptb
    
end 
        
    
else
    
begin
    
set @sqlstr='select address,name,tel,zip from '+@tb+' where charindex('''+@add+''',address)>0'
    
exec p_exporttb @sqlstr,
    
@path='e: emp',@fname=@add,@sheetname=@add
    
end
    
fetch next from mycursor into @add
end
close mycursor        --关闭游标
    deallocate mycursor   --删除游标

以上用了一个导出excel的存储过程sp_executesql  

 

create proc p_exporttb
 
  
@sqlstr   varchar(8000), --查询语句,如果查询语句中使用了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   
    
  
--数据库创建语句   
  if   exists(select   1   from   #tb   where   a=1)   
  
begin   
  
set   @sql='del   '+@path+@fname   
  
exec   master..xp_cmdshell   @sql   
  
end   
  
set   @sql=@path+@fname
  
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 
  

GO
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值