通過SQL語句直接實現Excel與資料庫的匯入匯出
阿新 • • 發佈:2019-02-15
--下面是匯出真正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 錯誤號
