it-swarm.com.de

Abfragen von Daten durch Zusammenfügen von zwei Tabellen in zwei Datenbanken auf verschiedenen Servern

Es gibt zwei Tabellen in zwei verschiedenen Datenbanken auf verschiedenen Servern. Ich muss sie verknüpfen, um einige Abfragen zu machen. Welche Möglichkeiten habe ich? Was soll ich machen?

83
Kashif

Sie müssen sp_addlinkedserver verwenden, um eine Server-Verknüpfung zu erstellen. Siehe Referenzdokumentation zur Verwendung. Sobald die Server-Verbindung hergestellt ist, erstellen Sie die Abfrage wie gewohnt, indem Sie dem anderen Server einfach den Datenbanknamen 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 OPENQUERY verwenden, um eine SQL-Anweisung auf dem Remote-Server auszuführen und nur die Daten an Sie zurückzusenden. Dies kann etwas schneller sein und der Remote-Server kann Ihre Abfrage optimieren. Wenn Sie die Daten in einer temporären (oder im Arbeitsspeicher befindlichen) Tabelle unter DB1 im obigen Beispiel zwischenspeichern, können Sie sie genauso abfragen wie eine Standardtabelle. Zum Beispiel:

-- 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 von OPENQUERY finden Sie weitere Beispiele. Das obige Beispiel ist ziemlich durchdacht. Ich würde definitiv die erste Methode in diesem speziellen Beispiel verwenden, aber die zweite Option, die OPENQUERY verwendet, kann Zeit und Leistung sparen, wenn Sie die Abfrage verwenden, um einige Daten herauszufiltern.

68
Scott Anderson

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

Wenn ein Verbindungsserver von Ihrer DBA nicht zugelassen wird, können Sie OPENROWSET verwenden. Die Online-Dokumentation enthält die von Ihnen benötigte Syntax.

4
HLGEM

Aus einer praktischen Unternehmensperspektive ist es am besten, eine gespiegelte Kopie der Datenbanktabelle in Ihrer Datenbank zu erstellen und diese dann mit einer Aufgabe/Prozedur stündlich zu aktualisieren.

2
Dave

Ein Join von zwei Tabellen wird am besten von einem DBMS ausgeführt, also auf diese Weise. Sie können die kleinere Tabelle oder eine Teilmenge davon in einer der Datenbanken spiegeln und dann zusammenfügen. Man könnte versucht sein, dies auf einem ETL-Server wie informatica zu tun, aber ich denke, es ist nicht ratsam, wenn die Tabellen groß sind.

1
Abdulmoeed

Wenn die Datenbankverknüpfungsoption nicht verfügbar ist, können Sie die Tabellen auch über ODBC mit etwas verknüpfen, z. B. MS Access- oder Crystal-Berichten, und die Verknüpfung dort herstellen.

1
Holdfast

Ich habe den folgenden Code 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
1
Quang Ninh

Während ich Probleme hatte, diese beiden Tabellen zu verbinden, tat ich genau das, 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 diese beiden OKs auf dem Bildschirm angezeigt werden, 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 Verknüpfungen zu erstellen, aber da ich diese beiden DBs geöffnet habe, kann ich hin und her gehen und Abfragen durchführen, indem ich einfach die Verbindung $mysqli1 oder $mysqli2 ändert. 

Es hat für mich funktioniert, ich hoffe es hilft ... Prost

0
Luis H Cabrejo

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

Vielleicht sind hartcodierte Datenbanknamen nicht immer die beste Lösung innerhalb einer SQL-Abfrage. Das Hinzufügen von Synonymen wäre daher ein besserer Ansatz. Es ist nicht immer der Fall, 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 hart codierte Abfragen und machen Sie sie dynamischer.

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

Ansatz Nr. 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.

0