2015年7月23日 星期四

Microsoft.Jet.OLEDB.4.0


Importing data from MS Access into SQL Server with TSQL



SELECT * FROM OPENDATASOURCE('Microsoft.Jet.OLEDB.4.0',
'Data Source=C:\DataFolder\Documents\TestExcel.xls;Extended Properties=EXCEL 5.0')...[Sheet1$] ;

-----Microsoft.Jet.OLEDB.4.0 vs Microsoft.ACE.OLEDB.12.0
需將txt 檔案 轉入至ms sql,個人是習慣用sql語法來達成目的,而不用SSIS或DTS這類工具。
利用opendatasource 函數,Provider:Microsoft.Jet.OLEDB.4.0
會報錯:
訊息 7308,層級 16,狀態 1,行 1
OLE DB 提供者 'Microsoft.Jet.OLEDB.4.0' 不能用來散佈查詢,因為提供者是設定成以單一執行緒 Apartment 模式執行。
後來了解到,我的系統是window server2008R2 x64 + MS SQL 2008R2 x64 而Microsoft.Jet.OLEDB.4.0是沒有x64的版本,
可改用Microsoft.ACE.OLEDB.12.0,而系統預設上是沒安裝的,這時可去微軟網站上
下載安裝 X64版的 Microsoft Access Database Engine 2010 可轉散發套件
安裝完即可使用 Microsoft.ACE.OLEDB.12.0 來存取txt了。
補充:
使用上沒問題一陣子後,有天突然報錯了,DEBUG的結果是,原TABLE轉出的TXT檔中的欄位字串資料有 , 存在,系統預設將 ,  當作欄位的delimited。
因此將TABLE 資料匯出成TXT時,改用別的符號當作欄位的dellimited,例如:  ~ ,當然也要跟ap人員協調 勿再輸入此符號,以免又誤判了。
然後txt檔匯入至另個instance的db時,在原本的 Extended Properties 加上FMT=Delimited(~)
EX:
select *
from OpenDataSource('Microsoft.ACE.OLEDB.12.0',
'Data Source = d:\;Extended Properties="Text;HDR=no;FMT=Delimited(~)"')...abc#txt
但似乎無法正確將 ~ 當作欄位delimited,
HDR=no 是ok的,但FMT=Delimited(~) 或 Format=Delimited(~) 都不work,
不知是否為屬性名稱的問題?
後來改在txt檔的同層目錄下 建立一個Schema.ini,讓text driver 依此設定來存取
ex:
[abc.txt]
Format=Delimited(~)
ColNameHeader=FALSE

沒有留言:

張貼留言