Sql-Server
連結伺服器引發元數據錯誤
我在 SQL Server 2019 中有一個函式,它使用 Oracle 19.3 客戶端通過連結伺服器將數據從本地表複製到 Oracle 11.2.0.4 表。最近,Oracle 表中添加了一個新列,因此我更新了插入函式以包含這個新列。
現在,每當我修改函式時,它都會成功執行一次,並且只執行一次。如果我清除查詢記憶體,它也會執行一次,然後從那時起開始拋出錯誤。第一次之後的所有執行嘗試都會拋出此錯誤:
消息 7353,級別 16,狀態 1,過程 COD.Interface_Upload,第 29 行
$$ Batch Start Line 20 $$連結伺服器“ORADEV-LINK”的 OLE DB 提供程序“OraOLEDB.Oracle”提供了不一致的元數據。在執行期間提供了一個額外的列,但在編譯時未找到。
與以前的工作版本相比,此過程的唯一更改是添加 DATE_SUBMITTED 欄位和“select min(
$$ Sample_date $$) …" 部分來提供該列。 我能找到的所有內容都表明,如果您遇到元數據錯誤,請轉到 OPENQUERY 語法,這就是我正在使用的語法。
功能是:
ALTER Procedure [COD].[Interface_Upload] As SET NOCOUNT ON; INSERT OPENQUERY([ORADEV-LINK], 'SELECT ACCOUNT_NUMBER, FROM_DATE, TO_DATE, COD_TO_BOD_FACTOR, CONSUMPTION, SAMPLE_DATE, COD_CONTENT, SS_CONTENT, DATE_SUBMITTED from cbd.WS_CBD_PACS') Select [Account_Number] ,[From_Date] ,[To_Date] ,[Factor] ,[Consumption] ,[Sample_date] ,[COD] ,[SS] , ( select min([Sample_date]) from dbo.ORA_Interface where Account_Number = p.Account_Number ) from dbo.ORA_Interface p ; Return @@rowcount; GO
Oracle 目標表定義為:
Null? Type ----------------------- -------- ------- ACCOUNT_NUMBER NOT NULL NUMBER(13) FROM_DATE NOT NULL DATE TO_DATE NOT NULL DATE COD_TO_BOD_FACTOR NOT NULL NUMBER(6,2) CONSUMPTION NOT NULL NUMBER(15) SAMPLE_DATE NOT NULL DATE COD_CONTENT NOT NULL NUMBER(10) SS_CONTENT NOT NULL NUMBER(10) DATE_SUBMITTED DATE
SQL Server 源表定義為:
[Account_Number] [varchar](30) NULL, [From_Date] [datetime] NULL, [To_Date] [datetime] NULL, [Factor] [numeric](15, 2) NULL, [Consumption] [numeric](15, 2) NULL, [Sample_date] [datetime] NULL, [COD] [numeric](15, 2) NULL, [SS] [numeric](15, 2) NULL
事實證明,這個問題是一個 Oracle 錯誤。更新檔 31892754:19C OLEDB 提供程序執行失敗,連結伺服器中的元數據不一致,解決了這個問題。
它需要 Oracle 19.3 和CU 31247621(但沒有更新的 CU)。
Oracle 表示此更新檔將包含在 Oracle 19.11 中,因此我假設這是 2021 年到期的 CU。
使用
OPTION (RECOMPILE)
在INSERT