Respostas:
Você precisará usar sp_addlinkedserver
para criar um link de servidor. Consulte a documentação de referência para uso. Assim que o link do servidor for estabelecido, você construirá a consulta normalmente, apenas prefixando o nome do banco de dados com o outro servidor. IE:
-- FROM DB1
SELECT *
FROM [MyDatabaseOnDB1].[dbo].[MyTable] tab1
INNER JOIN [DB2].[MyDatabaseOnDB2].[dbo].[MyOtherTable] tab2
ON tab1.ID = tab2.ID
Depois que o link for estabelecido, você também pode usar OPENQUERY
para executar uma instrução SQL no servidor remoto e transferir apenas os dados de volta para você. Isso pode ser um pouco mais rápido e permitirá que o servidor remoto otimize sua consulta. Se você armazenar os dados em cache em uma tabela temporária (ou na memória) DB1
no exemplo acima, será capaz de consultá-los da mesma forma que ingressar em uma tabela padrão. Por exemplo:
-- 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
Verifique a documentação do OPENQUERY para ver mais alguns exemplos. O exemplo acima é muito artificial. Eu definitivamente usaria o primeiro método neste exemplo específico, mas a segunda opção OPENQUERY
pode economizar algum tempo e desempenho se você usar a consulta para filtrar alguns dados.
Experimente isto:
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
Uma junção de duas tabelas é melhor feita por um SGBD, portanto, deve ser feito dessa forma. Você pode espelhar a tabela menor ou subconjunto dela em um dos bancos de dados e, em seguida, juntá-los. Alguém pode ficar tentado a fazer isso em um servidor ETL como a Informatica, mas acho que não é aconselhável se as tabelas forem enormes.
Se a opção de link de banco de dados não estiver disponível, outro caminho que você pode seguir é vincular as tabelas via ODBC a algo como o MS Access ou Crystal reports e fazer a junção lá.
Talvez nomes de banco de dados embutidos em código não sejam a melhor abordagem sempre em uma consulta SQL. Portanto, adicionar sinônimos seria uma abordagem melhor. Nem sempre é o caso de bancos de dados terem o mesmo nome em vários ambientes de teste. Eles podem consistir em postfixes como PROD, UAT, SIT, QA e assim por diante. Portanto, esteja ciente das consultas embutidas em código e torne-as mais dinâmicas.
Abordagem nº 1: use sinônimos para vincular tabelas entre bancos de dados no mesmo servidor.
Abordagem nº 2: Colete dados separadamente de cada banco de dados e junte-os ao seu código. Suas strings de conexão de banco de dados podem fazer parte da configuração do servidor de aplicativos por meio de um banco de dados ou de um arquivo de configuração.
Eu tentei este código abaixo e está funcionando bem
SELECT TimeTrackEmployee.StaffID
FROM dbo.tblGBSTimeCard AS GBSTimeCard INNER JOIN
TimeTrak.dbo.tblEmployee AS TimeTrackEmployee ON GBSTimeCard.[Employee Number] = TimeTrackEmployee.GBSStaffID
Você pode tentar o seguinte:
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 isso basta seguir a consulta abaixo
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
Onde escrevi databasename, você deve definir o nome do banco de dados. Se você estiver no mesmo banco de dados, não precisa definir o nome do banco de dados, mas se estiver em outro banco de dados, você deve mencionar o nome do banco de dados como caminho ou ele mostrará o erro. Espero ter facilitado o seu trabalho
Enquanto estava tendo problemas para unir essas duas tabelas, consegui fazer exatamente o que queria abrindo os dois bancos de dados remotos ao mesmo tempo. MySQL 5.6 (php 7.1) e o outro 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 você receber esses dois OKs na tela, os dois bancos de dados estarão abertos e prontos. Então você pode prosseguir para fazer suas perguntas.
$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();
Eu estava tentando fazer algumas junções, mas como abri esses dois bancos de dados, posso ir e voltar fazendo consultas apenas alterando a conexão $mysqli1
ou$mysqli2
Funcionou para mim, espero que ajude ... Saúde