Antworten:
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 OPENQUERY
eine 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 DB1
im 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 OPENQUERY
kann Zeit und Leistung sparen, wenn Sie die Abfrage zum Herausfiltern einiger Daten verwenden.
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
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.
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.
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.
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
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
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
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 $mysqli1
oder ändere$mysqli2
Es hat bei mir funktioniert, ich hoffe es hilft ... Prost