risposta-alla-domanda-sullo-sviluppo-web-bd.com

Interrogare i dati unendo due tabelle in due database su server diversi

Ci sono due tabelle in due diversi database su server diversi, ho bisogno di unirmi a loro per fare poche domande. Che opzioni ho? Cosa dovrei fare?

83
Kashif

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, si costruisce la query normalmente, semplicemente facendo precedere il nome del database con l'altro server. vale a dire:

-- 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, è possibile utilizzare OPENQUERY per eseguire un'istruzione SQL sul server remoto e trasferire solo i dati all'utente. Questo può essere un po 'più veloce e permetterà al server remoto di ottimizzare la tua query. Se si memorizzano nella cache i dati in una tabella temporanea (o in memoria) su DB1 nell'esempio precedente, sarà possibile interrogarli come se si stesse entrando in 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

Controlla la documentazione di OPENQUERY per vedere altri esempi. L'esempio sopra è abbastanza elaborato. Definirei sicuramente il primo metodo in questo specifico esempio, ma la seconda opzione che utilizza OPENQUERY consente di risparmiare tempo e prestazioni se si utilizza la query per filtrare alcuni dati.

68
Scott Anderson

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

Se il tuo dba non consente un server collegato, puoi utilizzare OPENROWSET. La documentazione online fornirà la sintassi necessaria.

4
HLGEM

Dal punto di vista dell'impresa, la migliore pratica consiste nel creare una copia speculare della tabella del database nel proprio database e quindi fare in modo che un'attività/proc aggiorni il delta ogni ora.

2
Dave

Un join di due tabelle è fatto meglio da un DBMS, quindi dovrebbe essere fatto in questo modo. È possibile eseguire il mirroring della tabella più piccola o di un sottoinsieme su uno dei database e quindi aggiungerli. Si potrebbe essere tentati di farlo su un server ETL come l'informatica ma immagino che non sia consigliabile se i tavoli sono enormi.

1
Abdulmoeed

Se l'opzione di collegamento al database non è disponibile, un'altra route che puoi fare è collegare le tabelle tramite ODBC a qualcosa come i report MS Access o Crystal e fare il join lì.

1
Holdfast

Ho provato questo codice qui sotto e sta funzionando bene

SELECT        TimeTrackEmployee.StaffID
FROM            dbo.tblGBSTimeCard AS GBSTimeCard INNER JOIN
                         TimeTrak.dbo.tblEmployee AS TimeTrackEmployee ON GBSTimeCard.[Employee Number] = TimeTrackEmployee.GBSStaffID
1
Quang Ninh

Mentre stavo avendo problemi ad unirmi a 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 si ottengono questi due OK sullo schermo, entrambi i database sono aperti e pronti. Quindi puoi procedere a fare i tuoi querys.

$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 provando a fare alcuni join ma da quando ho aperto quei due DB, allora posso andare avanti e indietro facendo i querys cambiando semplicemente la connessione $mysqli1 o $mysqli2 

Ha funzionato per me, spero che aiuti ... Saluti

0
Luis H Cabrejo

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

Forse i nomi di database codificati non sono l'approccio migliore sempre all'interno di una query SQL. Quindi, aggiungere sinonimi sarebbe un approccio migliore. Non è sempre il caso che i database abbiano lo stesso nome in diversi ambienti di staging. Possono consistere in postfix come PROD, UAT, SIT, QA e così via. Quindi, fai attenzione alle query codificate e rendile più dinamiche.

Approccio 1: utilizzare i sinonimi per collegare tabelle tra database sullo stesso server.

Approccio n. 2: raccogli i dati separatamente da ciascun database e unisciti al tuo codice. Le stringhe di connessione al database potrebbero far parte della configurazione del tuo server di app attraverso un database o un file di configurazione.

0
Niklas Henricson