2013-01-15 64 views
4

我其實不想修改任何數據庫,只是獲取數據。如何使用一條SELECT語句從兩個服務器中的兩個數據庫獲取數據?

我知道如何連接到每個數據庫單獨,與這些連接字符串:

Provider=SQLOLEDB.1;Data Source={0};Initial Catalog={1};Integrated Security=SSPI;Persist Security Info=False; 

Provider=OraOLEDB.Oracle.1;Data Source={0};User ID={1};Password={2};Persist Security Info=True; 

但我怎麼能一起得到這個重疊的數據?這是甚至可能的,特別是考慮到一個是Oracle和一個是SQL Server?或者,最好是單獨對每個數據庫執行SELECT語句,然後再匹配它們?


例如,我將如何讓所有10歲的學生喜歡藍色? two tables

請注意,DatabaseB中的所有項都有一個映射到DatabaseA的ID,但不是相反。

+5

我從連接字符串中假設您有一個SQL Server數據庫和一個Oracle數據庫。您可以在Oracle中創建指向SQL Server數據庫的數據庫鏈接,還是在SQL Server中創建指向Oracle的鏈接服務器?如果是這樣,那麼這些將在架構上更合適? Oracle數據庫使用什麼操作系統? –

回答

8

我已經完成了MySQL,Oracle和SQL服務器。您可以創建從中央MSSQL服務器到Oracle和其他MSSQL服務器的鏈接服務器。然後,您可以使用鏈接服務器直接查詢對象,也可以爲數據庫中的鏈接服務器表創建同義詞。圍繞創建和使用鏈接的服務器

步驟是:

  1. 在您的「主」 MSSQL服務器創建兩個鏈接服務器到包含兩個數據庫服務器或如你所說的數據庫A和數據庫B
  2. 然後,您可以使用普通的TSQL select語句直接查詢鏈接服務器上的表。

要創建鏈接的服務器到Oracle看到此鏈接:http://support.microsoft.com/kb/280106

,稍微介紹一下同義詞。如果您要在很多查詢中使用這些鏈接的服務器表,可能值得使用同義詞來幫助維護代碼。同義詞允許您以不同的名稱引用某些內容。

因此,例如,從您通常會使用以下語法來獲取數據鏈接的服務器選擇數據時:

SELECT * 
FROM Linkedserver.database.schema.table 

如果你創建了一個代名詞Linkedserver.database.schema.table作爲DBTable1語法將是:

SELECT * 
FROM DBTable1 

它節省了打字位加,如果你的鏈接服務器是否會改變你不需要在你的代碼去做改變。就像我說過的,如果你在很多代碼中使用鏈接服務器,這真的會有好處。

關於更謹慎的說明,您可以在不同服務器上的兩個表之間進行連接。 HOwever這通常痛苦緩慢。我發現你可以選擇不同服務器中的數據到臨時表中,加入臨時表通常可以加快速度。你的milage可能會有所不同,但如果你打算加入不同服務器上的表格,這種技術可以提供幫助。

讓我知道你是否需要更多的細節。

+1

這是我每天在我們的應用程序中使用它的工作。但是,如果性能是一個問題,您可能想要通過鏈接考慮數據複製或物化視圖。 – xQbert

+0

事實上,連接的服務器的性能可能很差。 – Namphibian

2

您使用的是哪個數據庫?大多數數據庫都帶有稱爲dblinks的概念。你必須在數據庫中創建一個數據庫B的DBLINK,然後你可以創建一個同義詞(不是必須但爲了方便),並使用它,就好像它是數據庫A

+0

我爲此包含了連接字符串...一個是Oracle數據庫,另一個是SQL Sever數據庫。 – Kalina

+0

在db2中,您可以聯合大多數關係數據庫。 Oracle也應該有可能。檢查這個http://stackoverflow.com/questions/6112848/connecting-oracle-to-sql-server-via-database-link。 – Satish

+0

選中此項。 http://www.sqlservercentral.com/Forums/Topic852699-1042-1.aspx和http://msdn.microsoft.com/en-us/library/ff772782.aspx和http://www.mssqltips.com/ sqlservertip/1433 /如何對建立鏈接的服務器,用於-SQL服務器和Oracle的64位客戶端/。鏈接服務器設置後,您可以查詢其他數據庫的任何表。 – Satish

0
SELECT (things) 
FROM databaseA.dbo.table t1 
INNER JOIN databaseB.dbo.table t2 ON t1.Col1 = t2.Col2 
WHERE t1.Col1 = 'something' 

編輯的表格 - 這條語句要滿足新的要求:

SELECT * 
FROM databaseA.dbo.table t1 
INNER JOIN databaseB.dbo.table t2 ON t1.ID = t2.ID 
WHERE t1.Age = 10 AND t2.FavoriteColor = 'Blue' 
0

假設數據庫是在同一臺服務器上,你應該能夠做這樣的事情:

SELECT t.field1, t.field2 
FROM database.schema.table t 
JOIN database2.scheme.table2 t2 
    on t.id = t2.id 
WHERE t2.field3 = ... 

如果數據庫在單獨的服務器,看看使用Linked Servers

+0

重要的是一個是SQL Server數據庫,另一個是Oracle數據庫嗎? – Kalina

+1

@bonCodigo - 剛剛發生在過去幾個小時 - 不知道誰是仇敵 - 你可以肯定在同一臺機器上從SQL Server鏈接到Oracle,儘管(其他人已經回答並收到了投票)......我的猜測是有人真的想要賞金,並且低估了其他答案...... – sgeddes

+0

;)我正在瀏覽每個答案,看看我們的答案在哪裏。至少我們還沒有;)給出了錯誤的信息。由於我對OP的評論,我無法真正刪除我的答案。讓我給你一個高興的人。人們不能不介意自己所謂的*勝利*而不降低其他人的權利。 – bonCodigo

-1

只要兩個數據庫都在同一臺服務器,你可以參考用數據庫名:)

SELECT * FROM db1.table1 
join 
db2.tbable2 
WHERE db1.table1.col1 = db2.table2.col1; 
+0

重要的是一個是SQL Server數據庫,另一個是Oracle數據庫嗎? – Kalina

+1

[oracle和sql server可以存在於同一臺服務器上嗎?](http://serverfault.com/questions/22840/can-oracle-and-sql-server-exist-on-the-same-server)是的。但是他們的語言使用情況有所不同,因此您想訪問表的哪一方?從sql服務器或反之亦然Oracle,抱歉從未嘗試到目前爲止:$您也可以閱讀此[SQL Server到Oracle數據同步的最佳實踐](http://serverfault.com/questions/5308/best-practices-for -sql-服務器到Oracle的數據同步?RQ = 1)。你最好在dba.stackexchange中拍攝這樣一個問題,否則得到專家回答:) – bonCodigo

0

嘗試建立在Visual Studio 3個LINQ查詢表。一個用於SQL Server,一個用於Oracle,另一個用於組合2個數據庫對象。

0

如果你想從兩個不同的服務器和數據庫中選擇數據,我會做一個聯合而不是聯接,因爲一個數據可能像蘋果,另一個可能像橘子。你仍然需要建立鏈接的服務器,我相信你可以在某些版本後,如果鏈接Oracle和SQL Server如圖所示,但你可以做這樣的事情:

select ColA, ColB, ColC 
from (ServerASQLServer).(DatabaseA).(schema).(table) 
UNION 
select ColA, ColB, ColC 
from (ServerBOracleServer).(DatabaseB).(schema).(table) 

如果執行內部聯接您的數據必須共享數據要綁定的類型,否則它們將從返回的數據集中被省略。聯盟必須共享列數據類型,但不關心邏輯。你實際上是在說:「根據列邏輯匹配將這兩組不同的行放在一起。」

但是你提到連接字符串,所以我很好奇,如果你想要在.NET類型的代碼方法中做到這一點?我可以爲此提供一個想法。

1

看起來像一個異構聯接(不同服務器/技術等數據)。

因此,不是直截了當的。如果你能使南非比亞的方法奏效,就這樣吧。否則,您需要將兩個表中的數據收集到一個公共位置(一個或另一個服務器'正在使用',或者僅用於共同定位數據的第三個服務器/技術)。然後你可以愉快地加入數據。許多ETL工具以這種方式工作,並且這種情況(幾乎)總是涉及在加入之前將一個或多個表重新分配到公共​​位置。 Oracle Data Integrator ETL工具執行此操作,Talend Open Studio的tJoin組件也是如此。

HTH

相關問題