Odpowiedzi:
Będziesz musiał użyć, sp_addlinkedserver
aby utworzyć łącze do serwera. Zobacz dokumentację referencyjną dotyczącą użytkowania. Po ustanowieniu połączenia z serwerem zapytanie zostanie utworzone w normalny sposób, po prostu poprzedzając nazwę bazy danych innym serwerem. TO ZNACZY:
-- FROM DB1
SELECT *
FROM [MyDatabaseOnDB1].[dbo].[MyTable] tab1
INNER JOIN [DB2].[MyDatabaseOnDB2].[dbo].[MyOtherTable] tab2
ON tab1.ID = tab2.ID
Po ustanowieniu połączenia możesz również użyć OPENQUERY
do wykonania instrukcji SQL na serwerze zdalnym i przesłania tylko danych z powrotem do Ciebie. Może to być nieco szybsze i pozwoli zdalnemu serwerowi zoptymalizować zapytanie. Jeśli zbuforujesz dane w tabeli tymczasowej (lub w pamięci) DB1
w powyższym przykładzie, będziesz mógł wykonać zapytanie tak samo, jak dołączając do standardowej tabeli. Na przykład:
-- 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
Sprawdź dokumentację OPENQUERY, aby zobaczyć więcej przykładów. Powyższy przykład jest dość wymyślony. Zdecydowanie użyłbym pierwszej metody w tym konkretnym przykładzie, ale druga opcja OPENQUERY
może zaoszczędzić trochę czasu i wydajności, jeśli użyjesz zapytania do odfiltrowania niektórych danych.
Spróbuj tego:
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
Połączenie dwóch tabel najlepiej wykonać za pomocą DBMS, więc należy to zrobić w ten sposób. Możesz wykonać kopię lustrzaną mniejszej tabeli lub jej podzbioru w jednej z baz danych, a następnie dołączyć do nich. Można by się pokusić o zrobienie tego na serwerze ETL, takim jak informatica, ale myślę, że nie jest to zalecane, jeśli tabele są ogromne.
Być może zakodowane na stałe nazwy baz danych nie zawsze są najlepszym podejściem w ramach zapytania SQL. Dlatego lepszym podejściem byłoby dodanie synonimów. Nie zawsze jest tak, że bazy danych mają tę samą nazwę w kilku środowiskach przejściowych. Mogą składać się z postfiksów, takich jak PROD, UAT, SIT, QA i tak dalej. Dlatego uważaj na zapytania zakodowane na stałe i nadaj im większą dynamikę.
Podejście nr 1: użyj synonimów, aby połączyć tabele między bazami danych na tym samym serwerze.
Podejście nr 2: Zbierz dane oddzielnie z każdej bazy danych i dołącz je do swojego kodu. Parametry połączenia z bazą danych mogą być częścią konfiguracji serwera aplikacji za pośrednictwem bazy danych lub pliku konfiguracyjnego.
Wypróbowałem ten kod poniżej i działa dobrze
SELECT TimeTrackEmployee.StaffID
FROM dbo.tblGBSTimeCard AS GBSTimeCard INNER JOIN
TimeTrak.dbo.tblEmployee AS TimeTrackEmployee ON GBSTimeCard.[Employee Number] = TimeTrackEmployee.GBSStaffID
Możesz spróbować następujących rzeczy:
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
w tym celu po prostu wykonaj poniższe zapytanie
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
Tam, gdzie napisałem nazwę bazy danych, musisz zdefiniować nazwę bazy danych. Jeśli jesteś w tej samej bazie danych, więc nie musisz definiować nazwy bazy danych, ale jeśli jesteś w innej bazie, musisz podać nazwę bazy danych jako ścieżkę lub wyświetli się błąd. Mam nadzieję, że ułatwiłem ci pracę
Podczas gdy miałem problemy z dołączeniem do tych dwóch tabel, udało mi się zrobić dokładnie to, co chciałem, otwierając obie zdalne bazy danych w tym samym czasie. MySQL 5.6 (php 7.1) i inne 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>";
}
Jeśli zobaczysz te dwa OK na ekranie, to obie bazy danych są otwarte i gotowe. Następnie możesz przystąpić do zadawania pytań.
$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();
Próbowałem wykonać kilka połączeń, ale ponieważ otworzyłem te dwie bazy danych, mogę przechodzić tam iz powrotem, wykonując zapytania, po prostu zmieniając połączenie $mysqli1
lub$mysqli2
Pomogło mi, mam nadzieję, że pomogło ... Pozdrawiam