• sql 导出/入Excel


     

    SQL Code
    go

    /*--数据导出EXCEL

    导出表中的数据到Excel,包含字段名,文件为真正的Excel文件
    ,如果文件不存在,将自动创建文件
    ,如果表不存在,将自动创建表
    基于通用性考虑,仅支持导出标准数据类型
    --作者: 邹建 --*/

    /*--调用示例

    p_exporttb @tbname='地区资料',@path='c:\',@fname='aa.xls'
    --*/
    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   varchar(8000), --查询语句,如果查询语句中使用了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)  
       print @sqlstr
      --参数检测  
      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="mailto:'+@sql+'%22;DBQ='+@sql  
      else  
      set   @constr='Provider=Microsoft.Jet.OLEDB.4.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.JET.OLEDB.4.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  
      go 

    /*--导出,以下是我的调用示例,上面的存储过程都是出自邹建笔下,顶啊--*/
    go
    create proc outExcel
    @ToID int,@stortype int,@os int,@Url varchar(60)
    as
    declare @Name nvarchar(60)
    set @Name = '盘点单'+(select replace(replace(replace(CONVERT(varchar, getdate(), 120 ),'-',''),' ',''),':',''))
    set @Name = @Name+'.xls'
    declare @sqlstr varchar(8000)
    set @sqlstr='select ID,Code as 编码,[Name] as 名称,Unit as 单位,Model as 产品型号,(SELECT isnull(sum(CC0),0)
    FROM cInventory WHERE (GoodsID = cgoods.ID)
    AND (ToID='+ltrim(@ToID)+')
    and stortype='+ltrim(@stortype)+' and os='+ltrim(@os)+')
    as 账面库存,''0'' as 实际数量,ImgNum as 货号,'''' as 备注
    from cgoods'
    exec p_exporttb @sqlstr,@Url,@Name,'盘点单'

    /*--导入--*/
    SELECT * FROM OpenDataSource(
     'Microsoft.Jet.OLEDB.4.0','Data Source="d:\盘点单.xls";User ID=Admin;Password=;Extended properties=Excel 5.0')
    ...[盘点单$]

  • 相关阅读:
    Jetty 的工作原理以及与 Tomcat 的比较
    基于Tengine的反向代理详细配置
    mysql定时脚本(event),类似oracle的job
    mysql 强制走索引
    如何检查mysql中建立的索引是否生效的检测方法及相关参数说明
    MySQL查询不使用索引汇总
    [大牛翻译系列]Hadoop 翻译文章索引
    [牛感悟系列]JAVA(1)理解JAVA垃圾回收
    [大牛翻译系列]Hadoop系列性能部分完结
    [大牛翻译系列]Hadoop(22)附录D.2 复制连接框架
  • 原文地址:https://www.cnblogs.com/myssh/p/1536935.html
Copyright © 2020-2023  润新知