declare@addnvarchar(255) declare@tbnvarchar(255) set@tb='b1' declare mycursor cursorforselect zhen from shzhen open mycursor fetchnextfrom mycursor into@add while (@@fetch_status=0) begin declare@sqlstrnvarchar(255) --print @add declare@sumint declare@sumstrnvarchar(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@iint set@i=1 declare@fstrnvarchar(50) ifobject_id('test.dbo.tmptb') isnotnulldroptable tmptb exec('select * into tmptb from '+@tb+' where charindex('''+@add+''',address)>0') while@sum>16000 begin set@fstr=@add+cast(@iasvarchar(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(@iasvarchar(10)) exec p_exporttb 'select address,name,tel,zip from tmptb', @path='e: emp',@fname=@fstr,@sheetname=@add droptable 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 fetchnextfrom mycursor into@add end close mycursor --关闭游标 deallocate mycursor --删除游标
以上用了一个导出excel的存储过程sp_executesql
createproc p_exporttb @sqlstrvarchar(8000), --查询语句,如果查询语句中使用了order by ,请加上top 100 percent @pathnvarchar(1000), --文件存放目录 @fnamenvarchar(250), --文件名 @sheetnamevarchar(250)=''--要创建的工作表名,默认为文件名 as declare@errint,@srcnvarchar(255),@descnvarchar(255),@outint declare@objint,@constrnvarchar(1000),@sqlvarchar(8000),@fdlistvarchar(8000) --参数检测 ifisnull(@fname,'')=''set@fname='temp.xls' ifisnull(@sheetname,'')=''set@sheetname=replace(@fname,'.','#') --检查文件是否已经存在 ifright(@path,1)<>''set@path=@path+'' createtable #tb(a bit,b bit,c bit) set@sql=@path+@fname insertinto #tb exec master..xp_fileexist @sql --数据库创建语句 ifexists(select1from #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<>0goto lberr exec@err=sp_oamethod @obj,'open',null,@constr if@err<>0goto 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+'] ' +casewhen b.name in('char','nchar','varchar','nvarchar') then 'text('+cast(casewhen a.length>255then255else a.length endasvarchar)+')' 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 leftjoin tempdb..systypes b on a.xtype=b.xusertype where b.name notin('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<>0goto 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: selectcast(@errasvarbinary(4)) as 错误号 ,@srcas 错误源,@descas 错误描述 select@sql,@constr,@fdlist GO