Sql-Server

連結伺服器引發元數據錯誤

  • January 21, 2021

我在 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

引用自:https://dba.stackexchange.com/questions/275605