SQL

SQL導出EXCEL(帶表頭)的存儲過程 收藏

自 鄒大牛

1:從表導出

--下面的存儲過程可以導出數據爲真正的excel文件   
    
  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   
    
  /*--數據導出EXCEL   
    
  導出表中的數據到Excel,包含字段名,文件爲真正的Excel文件   
  ,如果文件不存在,將自動創建文件   
  ,如果表不存在,將自動創建表   
  基於通用性考慮,僅支持導出標準數據類型   
    
  --鄒建   2003.10(引用請保留此信息)--*/   
    
  /*--調用示例   
    
  p_exporttb   @tbname='地區資料',@path='c:\',@fname='aa.xls'   
  --*/   
  create   proc   p_exporttb   
  @tbname   sysname, --要導出的表名   
  @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='''';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+'"'   
    
    
  --連接數據庫   
  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   
    
  /*--如果覆蓋已經存在的表,就加上下面的語句   
  --創建之前先刪除表/如果存在的話   
  select   @sql='drop   table   ['+@tbname+']'   
  exec   @err=sp_oamethod   @obj,'execute',@out   out,@sql   
  --*/   
    
  --創建表的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   syscolumns   a   left   join   systypes   b   on   a.xtype=b.xusertype   
  where   b.name   not   in('image','uniqueidentifier','sql_variant','varbinary','binary','timestamp')   
  and   object_id(@tbname)=id   
  select   @sql='create   table   ['+@tbname   
  +']('+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;IMEX=1   
  ;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

 2:從SQL導出

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   
    
  /*--數據導出EXCEL   
      
    導出查詢中的數據到Excel,包含字段名,文件爲真正的Excel文件   
    如果文件不存在,將自動創建文件   
    如果表不存在,將自動創建表   
    基於通用性考慮,僅支持導出標準數據類型   
    
  --鄒建   2003.10(引用請保留此信息)--*/   
    
  /*--調用示例   
    
    p_exporttb   @sqlstr='select   *   from   地區資料'   
      ,@path='c:\',@fname='aa.xls',@sheetname='地區資料'   
  --*/   
  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)   
    
  --參數檢測   
  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   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   

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章