--sql語句就用下面的存儲過程
/*--數據導出Excel
導出查詢中的數據到Excel,包含欄位名,文件為真正的Excel文件
,如果文件不存在,將自動創建文件
,如果表不存在,將自動創建表
基於通用性考慮,僅支持導出標準數據類型
--鄒建 2003.10--*/
/*--調用示例
p_exporttb @sqlstr=’select * from 地區資料』
,@path=』c:\』,@fname=』aa.xls』,@sheetname=』地區資料』
--*/
if exists (select * from dbo.sysobjects where id = object_id(N』[dbo].[p_exporttb]』) and OBJECTPROPERTY(id, N』IsProcedure』) = 1)
drop procedure [dbo].[p_exporttb]
GO
create proc p_exporttb
@sqlstr sysname, --查詢語句,如果查詢語句中使用了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
--資料庫創建語句
set @sql=@path+@fname
if exists(select 1 from #tb where a=1)
set @constr=』DRIVER={Microsoft Excel Driver (*.xls)};DSN=』』』』;READONLY=FALSE』
+』;CREATE_DB="』+@sql+』";DBQ=』+@sql
else
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