导出EXCEL的存储过程

IF OBJECT_ID('dbo.Proc_DBA_ExportExcel') IS NOT NULL
	DROP PROC dbo.Proc_DBA_ExportExcel  
GO
CREATE  PROC dbo.Proc_DBA_ExportExcel  
	@sqlstr varchar(8000),--查询语句,如果查询语句中使用了order by ,请加上top 100 percent  
	@path nvarchar(1000),--文件存放目录  
	@fname nvarchar(250),--文件名  
	@sheetname varchar(250)=''--要创建的工作表名,默认为文件名  
AS
BEGIN
	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='temp2012.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  
   
	--数据库创建语句  
	set @sql=@path+@fname  
	if exists(select 1 from #tb where a=1)  
	set @constr='DRIVER={Microsoft Excel Driver (*.xlsx)};DSN='''';READONLY=FALSE'  
	+';CREATE_DB="'+@sql+'";DBQ='+@sql  
	else  
	set @constr='Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties="Excel 8.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 like '%char'  
	then case when a.length>255 then 'memo'  
	else 'text('+cast(a.length as varchar)+')' end  
	when b.name like '%int' or b.name='bit' then 'int'  
	when b.name like '%datetime' then 'datetime'  
	when b.name like '%money' then 'money'  
	when b.name like '%text' then 'memo'  
	else b.name end  
	FROM tempdb..syscolumns a left join tempdb..systypes b on a.xtype=b.xusertype  
	where b.name not in('image','uniqueidentifier','sql_variant','varbinary','binary','timestamp')  
	and a.id=(select id from tempdb..sysobjects where name=@tbname)  
   
	if @@rowcount=0 return  
   
	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.ACE.OLEDB.12.0'',''Excel 8.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  
END
GO

使用:

sp_configure 'Ole Automation Procedures', '1'
GO
RECONFIGURE WITH OVERRIDE
GO
EXEC dbo.Proc_DBA_ExportExcel
	@sqlstr='SELECT * FROM [master].dbo.spt_values AS sv'
	,@path='d:\'
	,@fname='test.xlsx'
	,@sheetname='测试'
GO
sp_configure 'Ole Automation Procedures', '0'
GO
RECONFIGURE WITH OVERRIDE
GO

参考: 邹建博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值