页首Html代码

sql导出查询数据

if exists(select 1 from sysobjects where name ='proc_exporttb' and xtype ='P')
    drop proc proc_exporttb
go    
create proc proc_exporttb
@sqlstr varchar(max),                        --查询语句,如果查询语句中使用了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='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(3),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
end
go

--exec  proc_exporttb @sqlstr='select * from dbo.ClientLevel\',@path='d:\\\',@fname='aa.xls\',@sheetname='ClientLevel\'
View Code

 

posted @ 2014-04-23 13:56  binsite  阅读(591)  评论(0编辑  收藏  举报

页脚Html代码