zoukankan      html  css  js  c++  java
  • tsql导出EXCEL语句待测试


    /*=================== 导入/导出 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  

  • 相关阅读:
    ABP 基于DDD的.NET开发框架 学习(四)时间控件采用datetimepicker注意事项
    解决Vs控制台程序出现NuGetprofile.ps1,因为在此系统上禁止运行脚本错误时或提示:“无法加载文件 .nugetpackagesMicrosoft.EntityFrameworkCore.Tools1.1.0-preview4-final oolsinit.ps1,因为在此系统上禁止运行脚本”
    git 本地初始化项目操作
    php(thinkphp)在linux系统下pdf转png图片【转】
    git学习笔记
    git 2.4.5编译安装
    mysql占用内存高的问题
    vmware下虚拟机centos,root登录时候提示鉴定故障解决方法
    SSH.net之主程序
    SSH.net之Service层
  • 原文地址:https://www.cnblogs.com/y0umer/p/3839292.html
Copyright © 2011-2022 走看看