2011-02-28 81 views

回答

60

您需要使用sp_addlinkedserver來創建服務器鏈接。請參閱reference documentation的使用說明。一旦建立了服務器鏈接,就可以像平常一樣構建查詢,只需將數據庫名稱添加到其他服務器的前綴即可。即:

-- FROM DB1 
SELECT * 
FROM [MyDatabaseOnDB1].[dbo].[MyTable] tab1 
    INNER JOIN [DB2].[MyDatabaseOnDB2].[dbo].[MyOtherTable] tab2 
     ON tab1.ID = tab2.ID 

一旦建立鏈接,你也可以使用OPENQUERY到遠程服務器上執行SQL語句,只將數據傳送回給你。這可以更快一點,並且它可以讓遠程服務器優化您的查詢。如果您在上述示例中將數據緩存在DB1的臨時(或內存中)表中,那麼您將能夠查詢它,就像加入標準表一樣。例如:

-- Fetch data from the other database server 
SELECT * 
INTO #myTempTable 
FROM OPENQUERY([DB2], 'SELECT * FROM [MyDatabaseOnDB2].[dbo].[MyOtherTable]') 

-- Now I can join my temp table to see the data 
SELECT * FROM [MyDatabaseOnDB1].[dbo].[MyTable] tab1 
    INNER JOIN #myTempTable tab2 ON tab1.ID = tab2.ID 

查看documentation for OPENQUERY查看更多示例。上面的例子很有意思。在此具體示例中,我肯定會使用第一種方法,但如果使用查詢過濾掉某些數據,則使用OPENQUERY的第二個選項可以節省一些時間和性能。

+1

是否可以使用php-mysql ..如果是的話你能否給我一個建議,我該如何使用這個選項增長? – Jhanvi 2012-09-26 08:47:26

+1

我不知道MySQL是否支持鏈接服務器。這個答案是特定於Microsoft SQL服務器的。 – 2012-10-04 18:40:59

+0

如果有人正在尋找一個PostgreSQL的答案,試試這個:http://www.postgresql.org/docs/9.4/static/postgres-fdw.html – PJSCopeland 2015-01-19 22:27:48

4

如果您的dba不允許鏈接的服務器,則可以使用OPENROWSET。聯機叢書將提供您需要的語法。

1

兩個表的連接最好由DBMS完成,所以應該這樣做。您可以在其中一個數據庫上鏡像較小的表或其子集,然後加入它們。有人可能會試圖在ETL服務器上這樣做,比如informatica,但如果表格很大,我認爲它不可取。

1

從實際的企業角度來看,最好的做法是在數據庫中創建數據庫表的鏡像副本,然後只需要一個任務/ proc用delta每小時更新一次。

8

試試這個:

SELECT tab2.column_name 
FROM [DB1.mdf].[dbo].[table_name_1] tab1 INNER JOIN [DB2.mdf].[dbo].[table_name_2] tab2 
    ON tab1.col_name = tab2.col_name 
1

我想下面這段代碼和它的正常工作

SELECT  TimeTrackEmployee.StaffID 
FROM   dbo.tblGBSTimeCard AS GBSTimeCard INNER JOIN 
         TimeTrak.dbo.tblEmployee AS TimeTrackEmployee ON GBSTimeCard.[Employee Number] = TimeTrackEmployee.GBSStaffID 
1

如果數據庫鏈接選項不可用,你可以採取另一種途徑是通過鏈接表ODBC到MS Access或Crystal報告等,並在那裏進行連接。

0

你可以嘗試以下方法:

select customer1.Id,customer1.Name,customer1.city,CustAdd.phone,CustAdd.Country 
from customer1 
inner join [EBST08].[Test].[dbo].[customerAddress] CustAdd 
on customer1.Id=CustAdd.CustId 
0

也許硬編碼的數據庫名稱不是一個SQL查詢中始終是最好的辦法。因此,添加同義詞將是更好的方法。並非所有數據庫在多個分段環境中都具有相同的名稱。它們可能由PROD,UAT,SIT,QA等後綴組成。因此,請注意硬編碼查詢並使其更具動態性。方法#1:使用同義詞在同一臺服務器上的數據庫之間鏈接表。

方法2:從每個數據庫中分別收集數據並將其加入您的代碼中。您的數據庫連接字符串可以通過數據庫或配置文件成爲應用服務器配置的一部分。

0

這個只要按照以下查詢

select a.Id,a.type,b.Name,b.City from DatabaseName.dbo.TableName a left join DatabaseName.dbo.TableName b on a.Id=b.Id 

我在哪裏寫的數據庫名稱,你必須定義的數據庫的名稱。如果你在同一個數據庫中,所以你不需要定義數據庫名稱,但是如果你在其他數據庫中,你必須提及數據庫名稱作爲路徑,否則它會顯示錯誤。 希望我讓你的工作變得簡單

相關問題