從 SQL Server 連接到 Oracle
我們正在將應用程序從 Oracle 遷移到 SQL Server。供應商負責大部分遷移工作,但有一個是內部開發的,我遇到了麻煩。
Oracle 上的舊應用程序有一個收集特定數據的過程,然後另一個過程將該數據插入到我們收入系統(不同的 Oracle 伺服器)中的臨時表中。這是一個通過 Oracle 公共數據庫連結的 Oracle 過程。
在 SQL Server 中,我嘗試使用 SQL Server 的連結伺服器重寫此過程。我已經創建了與收入系統的連結伺服器連接,它可以通過該連結進行連接。
從 SQL*Plus,我可以以該使用者的身份發出此語句:
select * from rs.rs_myapp;
我得到了結果。(rs 是收入系統使用者,而不是我連接的使用者。rs_MyApp 表是我們數據在他們系統中的臨時表。)
但如果我嘗試在 SQL Server 中執行此操作:
select * from [rstest-Link]..rs.rs_myapp
我收到這條消息:
消息 7314,級別 16,狀態 1,第 50 行連結伺服器“rstest-Link”的 OLE DB 提供程序“OraOLEDB.Oracle”不包含表“rs”。“rs_myapp”。該表不存在或目前使用者對該表沒有權限。
但是,我可以這樣做:
select * from openquery([rstest-Link], 'select count(*) from rs.rs_myapp')
這會返回結果,表明該連結確實有效。
但是,由於 7314 錯誤,我無法完成 SQL Server 過程。該過程非常基本,其中只有一行程式碼:
Insert Into [rstest-Link]..rs.rs_myapp (ACCOUNT_NUMBER, FROM_DATE, TO_DATE, Data1, Data2, SAMPLE_DATE, Content1, Content2) select ACCOUNT_NUMBER, FROM_DATE, TO_DATE, MyData1, MyData2, SAMPLE_DATE, MyContent1, MyContent2 FROM dbo.RS_INTERFACE;
但是如果不解決 7314 錯誤,就無法創建過程。
那麼我該怎麼做呢?我是否必須使用游標並為每一行發出某種程式碼,例如:
INSERT OPENQUERY ([rstest-Link], 'SELECT ... FROM ...') VALUES ('...');
Oracle 使用區分大小寫的目錄,並通過在 DDL 和 DML 中將未加引號的標識符靜默轉換為全部大寫來隱藏這個醜陋的事實。
您的表的名稱實際上是 RS.RS_MYAPP,並且 SQL Server 可能會將標識符作為“rs”.“rs_myapp”發送給 Oracle,這將在 Oracle 上失敗。
所以試試
選擇 * 從
$$ rstest-Link $$..RS.RS_MYAPP
首先:我將嘗試自己回答問題:當您直接引用 ORACLE 表時,
[LinkedServerName]..[Schema].[Table]
您使用的是這種方法嗎?如果是這樣,請確保通過連結伺服器登錄的使用者在 ORACLE 端設置為使用 RPC Out。(通過連結伺服器設置)
^^編輯:忽略以上。大衛的回答很到位。
現在有一些想法:
我已經通過連結伺服器使用 SQL Server –> ORACLE 幾年了,我可以肯定地說,為了純粹的易用性和穩定性,在 ORACLE SQL / PL/SQL 中寫出查詢並使用 OPENQUERY( ) 對我來說比使用連結伺服器的表和用 T-SQL 編寫查詢要好得多。
為什麼?
- 好吧,當你用 ORACLE SQL 編寫它並通過它傳遞它時
OPENQUERY
,是 ORACLE 引擎在做繁重的工作,而 SQL Server 不必通過 Oracle 的優化器來爭取它的方式。SQL Server 只是等待查詢完成並接受結果。2)您可以在 ORACLE 端優化查詢,完成後在 SQL Server 端使用它。SQL Server 的優化器只是告訴我100% - 遠端查詢並將其保留在那裡。
- 如果您不必篩選 T-SQL,則問題(權限、優化等)更容易診斷。
4)當結果返回時,您仍然可以使用 T-SQL 操作結果(在外部 SELECT 語句中。這意味著您可以使用 Oracle 和 T-SQL Native 函式來處理您的查詢 。,,,,
TRUNC
它們都是可用的。SUBSTR``INSTR``CHARDINDEX
當我第一次開始使用 T-SQL 從 ORACLE 查詢時,我才精通 T-SQL,讓我告訴你,我一學會 PL/SQL,就開始
OPENQUERY
在 SQL Server 的語句中使用它。職責分離概念也適用於這些。當他們不打架時,他們會更快樂。