sql 匯出/入Excel

來源:互聯網
上載者:User
 

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')
...[盤點單$]

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.