t-sql导出EXCEL语句--待测试

简介: /*=================== 导入/导出 Excel 的基本方法 ===================*/ 从Excel文件中,导入数据到SQL数据库中,很简单,直接用下面的语句: /*========================================================*/  EXEC master.


/*=================== 导入/导出 Excel 的基本方法 ===================*/

从Excel文件中,导入数据到SQL数据库中,很简单,直接用下面的语句:

/*========================================================*/

 EXEC master..xp_cmdshell 'bcp " exec weberp.dbo.DailyCash_Excel @PayAccount=null,@StartDate=null,@EndDate=null,@TrackStation=null" queryout "C:\authors.xls" -c -S "(local)" -U "sa" -P "password"'
--如果接受数据导入的表已经存在

insert into 表 select * from

OPENROWSET('MICROSOFT.JET.OLEDB.4.0'

,'Excel 5.0;HDR=YES;DATABASE=c:test.xls',sheet1$)

--如果导入数据并生成表

select * into 表 from

OPENROWSET('MICROSOFT.JET.OLEDB.4.0'

,'Excel 5.0;HDR=YES;DATABASE=c:test.xls',sheet1$)

/*========================================================*/

--如果从SQL数据库中,导出数据到Excel,如果Excel文件已经存在,而且已经按照要接收的数据创建好表头,就可以简单的用:

insert into OPENROWSET('MICROSOFT.JET.OLEDB.4.0'

,'Excel 5.0;HDR=YES;DATABASE=c:test.xls',sheet1$)

select * from 表

--如果Excel文件不存在,也可以用BCP来导成类Excel的文件,注意大小写:

--导出表的情况

EXEC master..XP_cmdshell 'bcp 数据库名.dbo.表名 out "c:test.xls" /c -/S"服务器名" /U"用户名" -P"密码"'

--导出查询的情况

EXEC master..xp_cmdshell 'bcp "SELECT au_fname, au_lname FROM pubs..authors ORDER BY au_lname" queryout "c:test.xls" /c -/S"服务器名" /U"用户名" -P"密码"'

/*--说明:

c:test.xls 为导入/导出的Excel文件名.

sheet1$     为Excel文件的工作表名,一般要加上$才能正常使用.

--*/


/*--数据导出EXCEL 

  导出表中的数据到Excel,如果文件不存在,将自动创建文件,如果表不存在,将自动创建表 

  调用示例 
  ExportToExcel  @tbname='test',@path='c:\',@fname='test.xls' 

  --*/ 

  if  exists  (select  *  from  dbo.sysobjects  where  id  =  object_id(N'[dbo].[ExportToExcel]')  and  OBJECTPROPERTY(id,  N'IsProcedure')  =  1) 

  drop  procedure  [dbo].[ExportToExcel] 

  GO 

  

  create  proc  ExportToExcel 

  @Pac  , --要导出的表名,注意只能是表名/视图名 

  @path  nvarchar(1000), --文件存放目录 

  @fname  nvarchar(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=@tbname+'.xls' 

  --检查文件是否已经存在 

  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=TT;READONLY=FALSE' 

       +';CREATE_DB='+@sql+';DBQ='+@sql 

  else 

  set  @constr='Provider=Microsoft.Jet.OLEDB.4.0;Extended  Properties="Excel  8.0;HDR=YES' 

  +';DATABASE='+@sql+'"' 

  

  --连接数据库 

 print @constr

  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 

  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  syscolumns  a  left  join  systypes  b  on  a.xtype=b.xusertype 

  where  b.name  not  in('image','text','uniqueidentifier','sql_variant','ntext','varbinary','binary','timestamp') 

  and  object_id(@tbname)=id 

  select  @sql='create  table  ['+@tbname 

  +']('+substring(@sql,2,8000)+')' 

  ,@fdlist=substring(@fdlist,2,8000) 

   print @sql

  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 8.0;HDR=YES 

  ;DATABASE='+@path+@fname+''',['+@tbname+'$])' 

  

  exec('insert  into  '+@sql+'('+@fdlist+')  select  '+@fdlist+'  from  '+@tbname) 

  

  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 


CREATE   PROC   SqlToExcel  
  (  
  @Path                   varchar(100),--文件存放路径  
  @Fname                 varchar(100),--文件名字  
  @SheetName         varchar(80),---工作表名字  
  @SqlStr               varchar(8000)--查询语句,如果查询语句中使用了order       by       ,请加上top       100       percent,注意,如果导出表/视图,用上面的存储过程      
  )  
  AS  
  SET   NOCOUNT   ON  
   
  declare     @sql                 varchar(8000)  
  declare     @obj                 int--OLE对象  
  declare     @constr           varchar(8000)  
  declare     @err                 int  
  declare     @out                 int  
  declare     @fdlist           varchar(8000)  
  declare     @tbname           sysname--临时表  
  declare     @Src                 nvarchar(200)  
  declare     @Desc               nvarchar(200)  
   
  set   @tbname='##tmp_'+convert(varchar(38),newid())  
   
  exec('select   *   into   ['+@tbname   +']   from   '+'('+@sqlStr+')   A')  
   
  select   @fdlist   =   ''  
   
  set   @sql=   @path+@fname  
    set   @constr='DRIVER={Microsoft   Excel   Driver   (*.xls)};DSN='''';READONLY=FALSE'  
                +';CREATE_DB="'+@sql+'";DBQ='+@sql  
   
  --生成Excel的列  
  set   @sql   =   ''  
  select   @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,      
  @fdlist   =   @fdlist+','+'['+a.name+']'    
  from   tempdb..syscolumns   a     join   tempdb..systypes   b   on   a.xtype   =   b.xusertype    
  where   b.name   not   in('image','uniqueidentifier','sql_variant','varbinary','binary','timestamp')    
              and   id   in(select   id   from   tempdb..sysobjects   where   name   =   @tbname)   order   by   colorder  
  if   @@rowcount=0   return  
   
  set   @fdlist   =   substring(@fdlist,2,8000)  
   
  --连接数据库  
  exec   @err=sp_oacreate   'adodb.connection',@obj   out  
  if   @err   <>   0     goto   lberror  
  exec   @err=sp_oamethod   @obj,'open',null,@constr  
  if   @err   <>   0     goto   lberror  
  --创建工作薄  
  select   @sql='create   table   ['+@sheetname  
    +']('+substring(@sql,2,8000)+')'  
   
  exec   @err=sp_oamethod   @obj,'execute',@out   out,@sql--@sql为excute方法提供参数  
   
  if   @err   <>   0     goto   lberror  
   
  exec   @err=sp_oadestroy   @obj  
   
  --导入数据  
  set   @sql='openrowset(''MICROSOFT.JET.OLEDB.4.0'',''Excel   8.0;HDR=YES  
        ;DATABASE='+@path+@fname+''',['+@sheetname+'$])'  
  --print   @sql  
  exec   ('insert   into   '+@sql+'('+@fdlist+')   select   '+@fdlist+'   from   ['+@tbname+']')  
   
  exec('drop   table   ['+@tbname+']')  
  return  
   
   
  lberror:  
    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  

目录
相关文章
|
2天前
|
SQL 测试技术 网络安全
Python之SQLMap:自动SQL注入和渗透测试工具示例详解
Python之SQLMap:自动SQL注入和渗透测试工具示例详解
11 0
|
8天前
|
JSON JavaScript 前端开发
使用JavaScript和XLSX.js将数据导出为Excel文件
使用JavaScript和XLSX.js将数据导出为Excel文件
20 0
|
21天前
|
easyexcel 数据库
公司大佬对excel导入、导出的封装,那叫一个秒啊
封装公司统一使用的组件的主要目标是为了简化开发人员的调用流程,避免各个项目组重复集成和编写不规范的代码。文中提到对阿里EasyExcel进行了二次封装,提供了导入和导出功能,并支持模板的导入和导出。此外,还处理了读取数据与实际保存数据不一致的情况,通过提供自定义转换器来解决。
118 0
|
21天前
|
数据库
开发指南009-从list导出excel文件
从数据库返回一般是对象的列表,平台底层提供了从list转为excel文件的方法
|
21天前
|
前端开发
开发指南007-导出Excel
平台上开发导出Excel比过去的单体架构要复杂些,因为前端和后台不在一个进程空间里。
|
24天前
|
SQL 关系型数据库 MySQL
Hive【基础知识 02-1】【Hive CLI 命令行工具使用】【准备阶段-建库、建表、导入数据、编写测试SQL脚本并上传HDFS】
【4月更文挑战第7天】Hive【基础知识 02-1】【Hive CLI 命令行工具使用】【准备阶段-建库、建表、导入数据、编写测试SQL脚本并上传HDFS】
26 0
|
1月前
|
easyexcel
【EasyExcel】第二篇:导出excel文件,导出多个sheet工作空间
【EasyExcel】第二篇:导出excel文件,导出多个sheet工作空间
|
1月前
|
C#
C# gridControl 导出Excel
C# gridControl 导出Excel
|
1月前
|
JavaScript 前端开发
【导出Excel】Vue实现导出下载Excel文件(blob文件流)--亲测可用
【导出Excel】Vue实现导出下载Excel文件(blob文件流)--亲测可用
【导出Excel】Vue实现导出下载Excel文件(blob文件流)--亲测可用
|
1月前
|
SQL 数据库连接 数据库
【SQL Server】2. 将数据导入导出到Excel表格当中
【SQL Server】2. 将数据导入导出到Excel表格当中
47 0