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

102

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

Kashif
quelle
Als ob PRAMP Sie hierher gebracht hätte
Janac Meena

Antworten:

85

Sie müssen verwenden sp_addlinkedserver, um eine Serververbindung zu erstellen. Informationen zur Verwendung finden Sie in der Referenzdokumentation . Sobald die Serververbindung hergestellt ist, erstellen Sie die Abfrage wie gewohnt, indem Sie dem Datenbanknamen lediglich den anderen Server voranstellen. IE:

-- 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 OPENQUERYeine SQL-Anweisung auf dem Remote-Server ausführen und nur die Daten zurück an Sie übertragen. Dies kann etwas schneller sein und ermöglicht es dem Remote-Server, Ihre Abfrage zu optimieren. Wenn Sie die Daten in einer temporären (oder speicherinternen) Tabelle DB1im obigen Beispiel zwischenspeichern, können Sie sie wie beim Verbinden einer Standardtabelle abfragen. 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

In der Dokumentation zu OPENQUERY finden Sie weitere Beispiele. Das obige Beispiel ist ziemlich erfunden. Ich würde definitiv die erste Methode in diesem speziellen Beispiel verwenden, aber die zweite Option OPENQUERYkann Zeit und Leistung sparen, wenn Sie die Abfrage zum Herausfiltern einiger Daten verwenden.

Scott Anderson
quelle
1
Ist es mit PHP-MySQL möglich? Wenn ja, können Sie mir bitte einen Weg vorschlagen, wie ich mit dieser Option wachsen kann?
Jhanvi
1
Ich habe keine Ahnung, ob MySQL Verbindungsserver unterstützt. Diese Antwort ist spezifisch für Microsoft SQL Server.
Scott Anderson
3
Wenn jemand nach einer PostgreSQL-Antwort sucht, versuchen Sie dies: postgresql.org/docs/9.4/static/postgres-fdw.html
PJSCopeland
7

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
Dev ashish und kapil jangid
quelle
5

Wenn ein Verbindungsserver von Ihrer Datenbank nicht zugelassen wird, können Sie OPENROWSET verwenden. Books Online bietet die Syntax, die Sie benötigen.

HLGEM
quelle
4

Aus praktischer Unternehmenssicht besteht die beste Vorgehensweise darin, eine gespiegelte Kopie der Datenbanktabelle in Ihrer Datenbank zu erstellen und diese dann stündlich von einem Task / Proc mit Delta aktualisieren zu lassen.

Dave
quelle
1

Ein Join von zwei Tabellen wird am besten von einem DBMS durchgeführt, daher sollte dies auf diese Weise erfolgen. Sie können die kleinere Tabelle oder Teilmenge davon in einer der Datenbanken spiegeln und sie dann verbinden. Man könnte versucht sein, dies auf einem ETL-Server wie informatica zu tun, aber ich denke, es ist nicht ratsam, wenn die Tabellen riesig sind.

Abdulmoeed
quelle
1

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

Festhalten
quelle
0

Möglicherweise sind fest codierte Datenbanknamen nicht immer der beste Ansatz innerhalb einer SQL-Abfrage. Das Hinzufügen von Synonymen wäre daher ein besserer Ansatz. Es ist nicht immer so, dass Datenbanken in mehreren Staging-Umgebungen denselben Namen haben. Sie können aus Postfixes wie PROD, UAT, SIT, QA usw. bestehen. Achten Sie also auf fest codierte Abfragen und machen Sie sie dynamischer.

Ansatz 1: Verwenden Sie Synonyme, um Tabellen zwischen Datenbanken auf demselben Server zu verknüpfen.

Ansatz 2: Sammeln Sie Daten getrennt von jeder Datenbank und fügen Sie sie in Ihren Code ein. Ihre Datenbankverbindungszeichenfolgen können Teil Ihrer App-Server-Konfiguration sein, entweder über eine Datenbank oder eine Konfigurationsdatei.

Niklas Henricson
quelle
-2

Ich habe diesen Code unten ausprobiert und er funktioniert einwandfrei

SELECT        TimeTrackEmployee.StaffID
FROM            dbo.tblGBSTimeCard AS GBSTimeCard INNER JOIN
                         TimeTrak.dbo.tblEmployee AS TimeTrackEmployee ON GBSTimeCard.[Employee Number] = TimeTrackEmployee.GBSStaffID
Quang Ninh
quelle
Die Antworten sollten allgemein gehalten sein und nicht nur eine Kopie Ihrer Anwendungsfälle. Dies hilft auch nicht dem Benutzer, der die Frage gestellt hat.
Wladimir Gramacho
-2

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
Sohan Yadav
quelle
-2

Folgen Sie dazu einfach der folgenden Abfrage

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

Wo ich den Datenbanknamen geschrieben habe, müssen Sie den Namen der Datenbank definieren. Wenn Sie sich in derselben Datenbank befinden, müssen Sie den Datenbanknamen nicht definieren. Wenn Sie sich jedoch in einer anderen Datenbank befinden, müssen Sie den Datenbanknamen als Pfad angeben, da sonst ein Fehler angezeigt wird. Hoffe, ich habe deine Arbeit leicht gemacht

Bha15
quelle
-2

Während ich Probleme hatte, diese beiden Tabellen zu verbinden, konnte ich genau das tun, was ich wollte, indem ich beide entfernten Datenbanken gleichzeitig öffnete. MySQL 5.6 (PHP 7.1) und das andere MySQL 5.1 (PHP 5.6)

//Open a new connection to the MySQL server
$mysqli1 = new mysqli('server1','user1','password1','database1');
$mysqli2 = new mysqli('server2','user2','password2','database2');

//Output any connection error
if ($mysqli1->connect_error) {
    die('Error : ('. $mysqli1->connect_errno .') '. $mysqli1->connect_error);
} else { 
echo "DB1 open OK<br>";
}
if ($mysqli2->connect_error) {
    die('Error : ('. $mysqli2->connect_errno .') '. $mysqli2->connect_error);
} else { 
echo "DB2 open OK<br><br>";
}

Wenn Sie diese beiden OKs auf dem Bildschirm erhalten, sind beide Datenbanken geöffnet und bereit. Dann können Sie mit Ihren Abfragen fortfahren.

$results = $mysqli1->query("SELECT * FROM video where video_id_old is NULL");
    while($row = $results->fetch_array()) {
        $theID = $row[0];
        echo "Original ID : ".$theID." <br>";
        $doInsert = $mysqli2->query("INSERT INTO video (...) VALUES (...)");
        $doGetVideoID = $mysqli2->query("SELECT video_id, time_stamp from video where user_id = '".$row[13]."' and time_stamp = ".$row[28]." ");
            while($row = $doGetVideoID->fetch_assoc()) {
                echo "New video_id : ".$row["video_id"]." user_id : ".$row["user_id"]." time_stamp : ".$row["time_stamp"]."<br>";
                $sql = "UPDATE video SET video_id_old = video_id, video_id = ".$row["video_id"]." where user_id = '".$row["user_id"]."' and video_id = ".$theID.";";
                $sql .= "UPDATE video_audio SET video_id = ".$row["video_id"]." where video_id = ".$theID.";";
                // Execute multi query if you want
                if (mysqli_multi_query($mysqli1, $sql)) {
                    // Query successful do whatever...
                }
            }
    }
// close connection 
$mysqli1->close();
$mysqli2->close();

Ich habe versucht, einige Joins durchzuführen, aber da ich diese beiden DBs geöffnet habe, kann ich Abfragen durchführen, indem ich einfach die Verbindung $mysqli1oder ändere$mysqli2

Es hat bei mir funktioniert, ich hoffe es hilft ... Prost

Luis H Cabrejo
quelle
Ich denke, niemand hat gesagt, PHP nicht zu verwenden ... Ich hatte das gleiche Problem und konnte es mit etwas Programmierung lösen
Luis H Cabrejo