Risposte:
Dovrai utilizzare sp_addlinkedserver
per creare un collegamento al server. Vedere la documentazione di riferimento per l'utilizzo. Una volta stabilito il collegamento al server, costruirai la query come di consueto, anteponendo semplicemente il nome del database all'altro server. IE:
-- FROM DB1
SELECT *
FROM [MyDatabaseOnDB1].[dbo].[MyTable] tab1
INNER JOIN [DB2].[MyDatabaseOnDB2].[dbo].[MyOtherTable] tab2
ON tab1.ID = tab2.ID
Una volta stabilito il collegamento, è anche possibile utilizzare OPENQUERY
per eseguire un'istruzione SQL sul server remoto e trasferire di nuovo solo i dati. Questo può essere un po 'più veloce e consentirà al server remoto di ottimizzare la tua query. Se memorizzi nella cache i dati in una tabella temporanea (o in memoria) DB1
nell'esempio sopra, sarai in grado di interrogarli proprio come unirti a una tabella standard. Per esempio:
-- 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
Consulta la documentazione di OPENQUERY per vedere altri esempi. L'esempio sopra è piuttosto artificioso. Vorrei sicuramente utilizzare il primo metodo in questo esempio specifico, ma la seconda opzione OPENQUERY
può far risparmiare tempo e prestazioni se si utilizza la query per filtrare alcuni dati.
Prova questo:
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
Un join di due tabelle è fatto meglio da un DBMS, quindi dovrebbe essere fatto in questo modo. È possibile eseguire il mirroring della tabella o del sottoinsieme più piccolo su uno dei database e quindi unirli. Si potrebbe essere tentati di farlo su un server ETL come l'informatica, ma immagino che non sia consigliabile se le tabelle sono enormi.
Se l'opzione di collegamento al database non è disponibile, un altro percorso che potresti seguire è collegare le tabelle tramite ODBC a qualcosa come MS Access o Crystal Reports e fare il join lì.
Forse i nomi di database hardcoded non sono l'approccio migliore sempre all'interno di una query SQL. Pertanto, l'aggiunta di sinonimi sarebbe un approccio migliore. Non è sempre il caso che i database abbiano lo stesso nome in diversi ambienti di staging. Potrebbero essere costituiti da postfix come PROD, UAT, SIT, QA e così via. Quindi sii consapevole delle query hard-coded e rendile più dinamiche.
Approccio n. 1: utilizzare sinonimi per collegare tabelle tra database sullo stesso server.
Approccio n. 2: raccogli i dati separatamente da ogni database e uniscili nel tuo codice. Le stringhe di connessione al database potrebbero far parte della configurazione del server app tramite un database o un file di configurazione.
Ho provato questo codice di seguito e funziona bene
SELECT TimeTrackEmployee.StaffID
FROM dbo.tblGBSTimeCard AS GBSTimeCard INNER JOIN
TimeTrak.dbo.tblEmployee AS TimeTrackEmployee ON GBSTimeCard.[Employee Number] = TimeTrackEmployee.GBSStaffID
Potresti provare quanto segue:
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
per questo segui semplicemente la query di seguito
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
Dove ho scritto databasename, devi definire il nome del database. Se sei nello stesso database quindi non è necessario definire il nome del database, ma se sei in un altro database devi menzionare il nome del database come percorso o ti mostrerà un errore. Spero di aver reso il tuo lavoro facile
Mentre stavo avendo problemi a unire quei due tavoli, sono riuscito a fare esattamente quello che volevo aprendo entrambi i database remoti allo stesso tempo. MySQL 5.6 (php 7.1) e l'altro 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>";
}
Se vengono visualizzati quei due OK sullo schermo, entrambi i database sono aperti e pronti. Quindi puoi procedere con le tue ricerche.
$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();
Stavo cercando di eseguire alcuni join ma poiché ho aperto quei due DB, posso andare avanti e indietro facendo query semplicemente cambiando la connessione $mysqli1
o$mysqli2
Ha funzionato per me, spero che aiuti ... Salute