兩個Oracle Linked Server與SQL間資料移轉問題
我在一台SQL上設了Linked Server指向ORACLE,利用
INSERT INTO SqlTable
SELECT * FROM LinkedOracleServer..MySchema.MyTable
的方法從ORACLE端匯資料過來,一路相安無事。
直到今天同事改了ORACLE上的Schema,將USERNAME由VARCHAR2改為NVARCHAR2,結果在倒資料時冒出以下錯誤:
Msg 7356, Level 16, State 1, Line 5
The OLE DB provider "MSDAORA" for linked server "LinkedOracleServer" supplied inconsistent metadata for a column. The column "USERNAME" (compile-time ordinal 9) of object ""MySchema"."MyTable"" was reported to have a "DBTYPE" of 130 at compile time and 129 at run time.
Google了一下,有人說是9.2.0.4之前版本的Bug,我想起設Linked Server時用的是Microsoft OLEDB Provider for ORACLE,記得上回在處理中文問題時,它跟Oracle Provider for OLE DB產生的結果很不相同,所以我先想做的就是換一下Provider試試手氣。更換後,原本的問題就消失了。
正以為之後會一帆風順,卻又被潑了一盆冷水...
在ORACLE與SQL的有一組對應的Table,Schema/Primary Key設定都相同,但明明在ORACLE都是UNIQUE的資料,倒入SQL的對應Table卻出現Primary Key重複的錯誤。我反覆利用GROUP BY ... HAVING COUNT(*) > 1檢查ORACLE上的Table不下五次,明明就沒有重複資料呀,鬼月都過了還這樣。
後來,使出撒手鐧,將SQL上Table Primary Key設定先移除,倒完資料再用GROUP BY ... HAVING COUNT(*) > 1檢查,終於揪出凶手。繼上回發現ORACLE會將空字串當成NULL,今天又發現SQL Server會將VARCHAR欄位後方的空白自動RTRIM掉,而ORACLE則不會。今天出錯的原因就在於ORACLE上,有人手滑在設了兩筆資料,PK分別為'AAA'及'AAA ',在ORACLE上被視為兩筆,等要轉入SQL時,'AAA '被RTRIM成'AAA',就發生了PK重複的慘劇。找到苦主,請他把手滑的重複資料清除,總算搞定了原本應輕鬆做完的工作。
整合系統的日子真是多采多姿呀~~~