BlogNetSpace

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

分类:

技术点:

相关文章:

  • 2021-07-12
  • 2022-12-23
  • 2021-05-27
  • 2022-12-23
  • 2021-06-25
  • 2021-11-27
  • 2021-11-19
猜你喜欢
  • 2021-12-04
  • 2021-10-07
  • 2021-11-23
  • 2022-12-23
  • 2021-12-04
  • 2021-11-14
  • 2021-11-17
相关资源
相似解决方案