1. 程式人生 > > 通過SQL語句直接實現Excel與資料庫的匯入匯出

通過SQL語句直接實現Excel與資料庫的匯入匯出

--下面是匯出真正Excel檔案的方法:(請將一下所有程式碼複製到儲存過程中)

ifexists (select*from dbo.sysobjects where id =object_id(N'[dbo].[p_exporttb]'andOBJECTPROPERTY(id, N'IsProcedure'=1)
dropprocedure[dbo].[p_exporttb]
GO

/*--資料匯出EXCEL
 
 匯出表中的資料到Excel,包含欄位名,檔案為真正的Excel檔案
 ,如果檔案不存在,將自動建立檔案
 ,如果表不存在,將自動建立表
 基於通用性考慮,僅支援匯出標準資料型別

--鄒建 2003.10(引用請保留此資訊)--
*/


/*--呼叫示例

 p_exporttb @tbname='地區資料',@path='c:',@fname='aa.xls'
--
*/

createproc p_exporttb
@tbname sysname,    --要匯出的表名
@pathnvarchar(1000),   --檔案存放目錄
@fnamenvarchar(250)=''--檔名,預設為表名
as
declare@errint,@srcnvarchar(255),@descnvarchar(255),@outint
declare@objint,@constrnvarchar(1000),@sqlvarchar(8000),@fdlistvarchar(8000)

--引數檢測
ifisnull(@fname,'')=''set@fname=@tbname+'.xls'

--檢查檔案是否已經存在
ifright(@path,1)<>''set@path=@path+''
createtable #tb(a bit,b bit,c bit)
set@sql=@path+@fname
insertinto #tb exec master..xp_fileexist @sql

--資料庫建立語句
set@sql=@path+@fname
ifexists(select1from #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<>0goto lberr

exec@err=sp_oamethod @obj,'open',null,@constr
if@err<>0goto lberr

/*--如果覆蓋已經存在的表,就加上下面的語句
--建立之前先刪除表/如果存在的話
select @sql='drop table ['[email protected]+']'
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' 
   
thencasewhen a.length>255then'memo'
    
else'text('+cast(a.length asvarchar)+')'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 leftjoin systypes b on a.xtype=b.xusertype
where b.name notin('image','uniqueidentifier','sql_variant','varbinary','binary','timestamp')
 
andobject_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<>0goto 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:
 
selectcast(@errasvarbinary(4)) as 錯誤號