錯誤現象
SELECT * FROM test..TEST.TEST1
-- Msg 7356, Level 16, State 1
-- OLE DB provider 'OraOLEDB.Oracle' reported inconsistent metadata.
-- Column 'DUMMY' (compile-time ordinal 1) was reported to have DBTYPE 129 at compile time and 130 at run time.
根因分析
- Oracle 表中存在**無精度/長度不定**的數據類型(如
VARCHAR 未指定長度、NUMBER 未指定精度刻度)。
- 編譯期元數據(DBTYPE 129)與運行期實際類型(DBTYPE 130)不一致。
- 屬於 **Oracle Bug 3117040**,已在 **9.2.0.4.10** 修復。
解決路徑
- 升級 Oracle Client/Server 至 9.2.0.4.10 或更高版本(根治)。
- 臨時規避(不升級場景):
在 Linked Server 查詢中**顯式列出列名**,避開無精度列;或建視圖轉換類型(CAST(col AS VARCHAR2(100)))後再查詢視圖。
- 建模規範:所有字符/數值類型**強制指定精度長度**(
VARCHAR2(100), NUMBER(10,2)),杜絕裸類型。
驗證腳本
-- 確認問題列
SELECT column_name, data_type, data_length, data_precision, data_scale
FROM all_tab_columns@oralink
WHERE table_name = 'TEST1' AND owner = 'TEST';
-- 針對 data_length/precision 為 NULL 的列進行 CAST 或排除