Frage Abfragen von Daten durch Verbinden von zwei Tabellen in zwei Datenbanken auf verschiedenen Servern


Es gibt zwei Tabellen in zwei verschiedenen Datenbanken auf verschiedenen Servern, ich muss sie verbinden, um wenige Abfragen zu machen. Welche Möglichkeiten habe ich? Was soll ich machen?


75
2018-02-28 17:55


Ursprung


Antworten:


Sie müssen verwenden sp_addlinkedserver um eine Serververbindung zu erstellen. Siehe die Referenzdokumentation zur Verwendung. Sobald die Serververbindung hergestellt ist, erstellen Sie die Abfrage als normal, indem Sie den Datenbanknamen dem anderen Server voranstellen. I.E:

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

Sobald die Verbindung hergestellt ist, können Sie auch verwenden OPENQUERY um eine SQL-Anweisung auf dem Remote-Server auszuführen und nur die Daten an Sie zurück zu übertragen. Dies kann etwas schneller sein, und der Remote-Server wird Ihre Abfrage optimieren. Wenn Sie die Daten in einer temporären (oder speicherinternen) Tabelle zwischenspeichern DB1 Im obigen Beispiel können Sie es genauso abfragen wie bei einer Standardtabelle. Beispielsweise:

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

Besuche die Dokumentation für OPENQUERY um einige Beispiele zu sehen. Das obige Beispiel ist ziemlich erfunden. Ich würde definitiv die erste Methode in diesem speziellen Beispiel verwenden, aber die zweite Option verwenden OPENQUERY Sie können Zeit und Leistung sparen, wenn Sie die Abfrage verwenden, um einige Daten herauszufiltern.


61
2018-02-28 17:59



Versuche dies:

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

8
2018-03-13 06:28



Wenn Ihr dba keinen Verbindungsserver zulässt, können Sie OPENROWSET verwenden. Books Online wird die von Ihnen benötigte Syntax bereitstellen.


4
2018-02-28 18:01



Aus praktischer Unternehmensperspektive ist es am besten, eine gespiegelte Kopie der Datenbanktabelle in Ihrer Datenbank zu erstellen und dann nur eine Task / proc mit delta's jede Stunde aktualisieren zu lassen.


2
2017-11-15 15:41



Ein Join zweier Tabellen wird am besten von einem DBMS erledigt, also sollte es so gemacht werden. Sie könnten die kleinere Tabelle oder Teilmenge davon in einer der Datenbanken spiegeln und dann mit ihnen verbinden. Man könnte versucht werden, dies auf einem ETL-Server wie Informatica zu tun, aber ich denke, es ist nicht ratsam, wenn die Tabellen riesig sind.


1
2018-02-28 18:02



Wenn die Option für die Datenbankverknüpfung nicht verfügbar ist, können Sie die Tabellen über ODBC mit MS Access- oder Crystal Reports-Berichten verknüpfen und den Join dort durchführen.


1
2018-03-18 17:38



Ich habe diesen Code unten versucht und es funktioniert gut

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

1
2017-09-26 10:58



Sie könnten Folgendes versuchen:

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
2017-12-01 10:58