Respuestas:
Deberá utilizar sp_addlinkedserver
para crear un enlace de servidor. Consulte la documentación de referencia para conocer su uso. Una vez que se establece el enlace del servidor, construirá la consulta como de costumbre, simplemente prefijando el nombre de la base de datos con el otro servidor. ES DECIR:
-- FROM DB1
SELECT *
FROM [MyDatabaseOnDB1].[dbo].[MyTable] tab1
INNER JOIN [DB2].[MyDatabaseOnDB2].[dbo].[MyOtherTable] tab2
ON tab1.ID = tab2.ID
Una vez que se establece el enlace, también puede usar OPENQUERY
para ejecutar una declaración SQL en el servidor remoto y transferirle solo los datos. Esto puede ser un poco más rápido y permitirá que el servidor remoto optimice su consulta. Si almacena en caché los datos en una tabla temporal (o en memoria) DB1
en el ejemplo anterior, podrá consultarlos como si se uniera a una tabla estándar. Por ejemplo:
-- 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
Consulte la documentación de OPENQUERY para ver algunos ejemplos más. El ejemplo anterior es bastante elaborado. Definitivamente usaría el primer método en este ejemplo específico, pero la segunda opción que usa OPENQUERY
puede ahorrar algo de tiempo y rendimiento si usa la consulta para filtrar algunos datos.
Prueba esto:
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
La combinación de dos tablas se realiza mejor con un DBMS, por lo que debe hacerse de esa manera. Puede reflejar la tabla más pequeña o un subconjunto de ella en una de las bases de datos y luego unirlas. Uno podría tener la tentación de hacer esto en un servidor ETL como informatica, pero supongo que no es aconsejable si las tablas son enormes.
Si la opción de enlace de la base de datos no está disponible, otra ruta que podría tomar es vincular las tablas a través de ODBC a algo como MS Access o Crystal Reports y unirse allí.
Quizás los nombres de bases de datos codificados no sean el mejor enfoque siempre dentro de una consulta SQL. Por lo tanto, agregar sinónimos sería un mejor enfoque. No siempre es el caso de que las bases de datos tengan el mismo nombre en varios entornos de ensayo. Pueden consistir en sufijos como PROD, UAT, SIT, QA, etc. Por lo tanto, tenga en cuenta las consultas codificadas de forma rígida y hágalas más dinámicas.
Enfoque n. ° 1: use sinónimos para vincular tablas entre bases de datos en el mismo servidor.
Enfoque n. ° 2: recopile datos por separado de cada base de datos y únalos en su código. Las cadenas de conexión de su base de datos podrían ser parte de la configuración de su servidor de aplicaciones a través de una base de datos o un archivo de configuración.
Probé este código a continuación y está funcionando bien
SELECT TimeTrackEmployee.StaffID
FROM dbo.tblGBSTimeCard AS GBSTimeCard INNER JOIN
TimeTrak.dbo.tblEmployee AS TimeTrackEmployee ON GBSTimeCard.[Employee Number] = TimeTrackEmployee.GBSStaffID
Puedes probar lo siguiente:
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
para esto simplemente siga la siguiente consulta
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
Donde escribí el nombre de la base de datos, tienes que definir el nombre de la base de datos. Si está en la misma base de datos, entonces no necesita definir el nombre de la base de datos, pero si está en otra base de datos, debe mencionar el nombre de la base de datos como ruta o le mostrará un error. Espero haberte facilitado el trabajo
Mientras tenía problemas para unir esas dos tablas, logré hacer exactamente lo que quería al abrir ambas bases de datos remotas al mismo tiempo. MySQL 5.6 (php 7.1) y el otro 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>";
}
Si obtiene esos dos OK en la pantalla, ambas bases de datos están abiertas y listas. Luego puede proceder a realizar sus consultas.
$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();
Estaba tratando de hacer algunas uniones, pero como abrí esas dos bases de datos, puedo ir y venir haciendo consultas simplemente cambiando la conexión $mysqli1
o$mysqli2
Funcionó para mí, espero que ayude ... Saludos