Sql 通过连接不同服务器上两个数据库中的两个表来查询数据
在不同的服务器上的两个不同的数据库中有两个表,我需要将它们连接起来以便进行少量查询。我有什么选择?我该怎么办?您需要使用Sql 通过连接不同服务器上两个数据库中的两个表来查询数据,sql,sql-server,database,sql-server-2005,sql-server-2008,Sql,Sql Server,Database,Sql Server 2005,Sql Server 2008,在不同的服务器上的两个不同的数据库中有两个表,我需要将它们连接起来以便进行少量查询。我有什么选择?我该怎么办?您需要使用sp\u addlinkedserver创建服务器链接。有关用法,请参阅。一旦建立了服务器链接,您将按照正常方式构造查询,只需在数据库名称前面加上另一台服务器。即: -- FROM DB1 SELECT * FROM [MyDatabaseOnDB1].[dbo].[MyTable] tab1 INNER JOIN [DB2].[MyDatabaseOnDB2].[db
sp\u addlinkedserver
创建服务器链接。有关用法,请参阅。一旦建立了服务器链接,您将按照正常方式构造查询,只需在数据库名称前面加上另一台服务器。即:
-- FROM DB1
SELECT *
FROM [MyDatabaseOnDB1].[dbo].[MyTable] tab1
INNER JOIN [DB2].[MyDatabaseOnDB2].[dbo].[MyOtherTable] tab2
ON tab1.ID = tab2.ID
建立链接后,您还可以使用OPENQUERY
在远程服务器上执行SQL语句,并仅将数据传输回您。这可以快一点,并且可以让远程服务器优化您的查询。如果在上例中,将数据缓存在DB1
上的临时(或内存)表中,则可以像加入标准表一样对其进行查询。例如:
-- 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
查看以查看更多示例。上面的例子很做作。在这个特定的示例中,我肯定会使用第一种方法,但是如果您使用查询过滤掉一些数据,那么使用
OPENQUERY
的第二种方法可以节省一些时间和性能。如果dba不允许使用链接服务器,您可以使用OPENROWSET。联机丛书将提供您需要的语法。两个表的连接最好由DBMS完成,因此应该这样做。您可以在其中一个数据库上镜像较小的表或其子集,然后将它们联接起来。在informatica这样的ETL服务器上执行此操作可能会受到诱惑,但我想如果表太大,则不建议这样做。从实际的企业角度来看,最佳做法是在数据库中创建数据库表的镜像副本,然后让task/proc每小时用增量更新一次。尝试以下方法:
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
我尝试了下面的代码,它运行良好
SELECT TimeTrackEmployee.StaffID
FROM dbo.tblGBSTimeCard AS GBSTimeCard INNER JOIN
TimeTrak.dbo.tblEmployee AS TimeTrackEmployee ON GBSTimeCard.[Employee Number] = TimeTrackEmployee.GBSStaffID
如果数据库链接选项不可用,您可以采取的另一种方法是通过ODBC将表链接到诸如MS Access或Crystal reports之类的东西,并在那里进行连接。您可以尝试以下操作:
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
在SQL查询中,硬编码数据库名称可能不是最好的方法。因此,添加同义词将是更好的方法。在多个登台环境中,数据库的名称并不总是相同的。它们可能由诸如PROD、UAT、SIT、QA等后缀组成。因此,请注意硬编码查询,并使其更具动态性 方法1:使用同义词链接同一服务器上数据库之间的表
方法2:分别从每个数据库收集数据,并将其加入到代码中。您的数据库连接字符串可以通过数据库或配置文件作为应用服务器配置的一部分。为此,只需遵循以下查询
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
在我写databasename的地方,您必须定义数据库的名称。如果您在同一个数据库中,则不需要定义数据库名称,但如果您在其他数据库中,则必须将数据库名称作为路径,否则将显示错误。
希望我简化了您的工作当我在连接这两个表时遇到困难时,我通过同时打开两个远程数据库,完全实现了我的目的。MySQL 5.6(PHP7.1)和其他MySQL 5.1(PHP5.6)
//打开到MySQL服务器的新连接
$mysqli1=newmysqli('server1','user1','password1','database1');
$mysqli2=newmysqli('server2','user2','password2','database2');
//输出任何连接错误
如果($mysqli1->connect\u错误){
die('Error:('.$mysqli1->connect\u errno.')。$mysqli1->connect\u Error);
}否则{
回显“DB1打开正常
”;
}
如果($mysqli2->connect\u错误){
die('Error:('.$mysqli2->connect\u errno.')。$mysqli2->connect\u Error);
}否则{
回显“DB2OpenOK
”;
}
若你们在屏幕上看到了这两个OK,那个么这两个数据库都是打开的并且准备好了。然后,您可以继续进行查询
$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();
$results=$mysqli1->query(“从视频中选择*,其中视频id为空”);
而($row=$results->fetch_array()){
$theID=$row[0];
回显“原始ID:.$theID.”
“;
$doInsert=$mysqli2->query(“插入视频(…)值(…)”;
$doGetVideoID=$mysqli2->query(“从视频中选择视频标识,时间戳,其中用户标识=””。$row[13]”和时间戳=“.$row[28]”);
而($row=$doGetVideoID->fetch_assoc()){
回显“新视频id:.$row[“视频id”]。$row[“用户id”]。$time\U stamp:.$row[“time\U stamp”]。”
;
$sql=“更新视频集视频\u id\u old=video\u id,video\u id=”.$row[“video\u id”]。“其中user\u id=”。“$row[“user\u id”]。”和video\u id=“.$theID.”;
$sql.=“更新视频/音频集视频/视频id=”.$row[“视频/视频id”]。“其中视频/视频id=”.$theID.;”;
//如果需要,请执行多重查询
if(mysqli_多_查询($mysqli1,$sql)){
//查询成功做任何事。。。
}
}
}
//密切联系
$mysqli1->close();
$mysqli2->close();
我试图进行一些连接,但由于我打开了这两个数据库,因此我可以通过更改连接来来回查询$mysqli1
或$mysqli2
它对我有用,我希望它能帮助我。。。干杯使用php mysql是否可行……如果可以,请您建议我如何使用该选项实现增长?我不知道mysql是否支持链接服务器。此答案特定于Microsoft SQL server。如果有人正在寻找PostgreSQL答案,请尝试以下方法:答案应为通用答案,而不仅仅是用例的复制粘贴。而且,这对提出问题的用户也没有帮助。我想没有人说过不要使用php。。。我也有同样的问题,我可以通过一些编程来解决,比如如果普拉普把你带到这里
$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();