在不同服务器上的两个不同数据库中有两个表,我需要将它们连接起来才能进行少量查询。我有什么选择?我该怎么办?通过在不同服务器上的两个数据库中连接两个表来查询数据
回答
您需要使用sp_addlinkedserver
来创建服务器链接。请参阅reference documentation的使用说明。一旦建立了服务器链接,就可以像平常一样构建查询,只需将数据库名称添加到其他服务器的前缀即可。即:
-- 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
查看documentation for OPENQUERY查看更多示例。上面的例子很有意思。在此具体示例中,我肯定会使用第一种方法,但如果使用查询过滤掉某些数据,则使用OPENQUERY
的第二个选项可以节省一些时间和性能。
如果您的dba不允许链接的服务器,则可以使用OPENROWSET。联机丛书将提供您需要的语法。
两个表的连接最好由DBMS完成,所以应该这样做。您可以在其中一个数据库上镜像较小的表或其子集,然后加入它们。有人可能会试图在ETL服务器上这样做,比如informatica,但如果表格很大,我认为它不可取。
从实际的企业角度来看,最好的做法是在数据库中创建数据库表的镜像副本,然后只需要一个任务/ proc用delta每小时更新一次。
试试这个:
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报告等,并在那里进行连接。
你可以尝试以下方法:
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
我在哪里写的数据库名称,你必须定义的数据库的名称。如果你在同一个数据库中,所以你不需要定义数据库名称,但是如果你在其他数据库中,你必须提及数据库名称作为路径,否则它会显示错误。 希望我让你的工作变得简单
- 1. 通过REST在两个不同服务器上的两个数据库之间接收数据
- 2. SSIS - 来自两个数据库在不同服务器上的OleDB源查询
- 3. 在同一台服务器上从两个不同数据库中加入两个数据库表
- 4. 使用位于不同服务器上的两个数据库中的两个表的写入查询
- 5. 如何连接来自不同数据库的两个表格
- 6. 如何连接来自两个不同数据库的两个表?
- 7. 同步来自两个不同PostgreSQL数据库的两个表
- 8. 如何在两个不同的数据库中连接两个表?
- 9. 在同一台服务器上查询两个mysql数据库的性能?
- 10. MySQL:跨多个位于不同服务器上的数据库连接查询
- 11. 连接两个数据库
- 12. 在一个laravel中连接两个不同的数据库5.5
- 13. tsql - 将不同数据库中的两个表连接到不同的服务器上
- 14. 查询两个数据库
- 15. linq查询来自两个数据库
- 16. 连接两个数据表
- 17. 两台服务器两个表单和一个数据库
- 18. 在不同的服务器上连接两个表
- 19. 在laravel中连接两个数据库
- 20. 连接到单个类中的两个不同数据库
- 21. 如何连接多个数据库,mysql中的服务器和查询两个表中的对方?
- 22. 在不同的服务器(同一ISP)上同步两个mysql数据库
- 23. 在不同数据库服务器上的2个表上选择查询
- 24. 从不同模式查询两个表,但数据库相同
- 25. 如何使用Cakephp连接两个不同的数据库表?
- 26. 将两个表与来自不同查询的数据合并?
- 27. C#通过Web服务同步两个相同的数据集
- 28. 在一台服务器上查询两个数据库的性能
- 29. PHP - 在两个不同的表中显示数据库数据
- 30. 使用来自同一服务器内不同域的两个数据库
是否可以使用php-mysql ..如果是的话你能否给我一个建议,我该如何使用这个选项增长? – Jhanvi 2012-09-26 08:47:26
我不知道MySQL是否支持链接服务器。这个答案是特定于Microsoft SQL服务器的。 – 2012-10-04 18:40:59
如果有人正在寻找一个PostgreSQL的答案,试试这个:http://www.postgresql.org/docs/9.4/static/postgres-fdw.html – PJSCopeland 2015-01-19 22:27:48