通过在不同服务器上的两个数据库中连接两个表来查询数据
在不同的服务器上的两个不同的数据库中有两个表,我需要join他们,以便作出几个查询。 我有什么select? 我该怎么办?
您将需要使用sp_addlinkedserver
来创build服务器链接。 请参阅参考文档了解使用情况。 一旦build立了服务器链接,就可以像平常一样构build查询,只需在其他服务器前添加数据库名称即可。 IE:
-- FROM DB1 SELECT * FROM [MyDatabaseOnDB1].[dbo].[MyTable] tab1 INNER JOIN [DB2].[MyDatabaseOnDB2].[dbo].[MyOtherTable] tab2 ON tab1.ID = tab2.ID
链接build立之后,您还可以使用OPENQUERY
在远程服务器上执行SQL语句,并仅将数据传回给您。 这可以更快一点,它会让远程服务器优化您的查询。 如果您在上面的示例中将数据caching在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的文档以查看更多示例。 上面的例子很有意思。 我肯定会在这个特定的例子中使用第一种方法,但使用OPENQUERY
的第二个选项可以节省一些时间和性能,如果你使用查询来过滤掉一些数据。
尝试这个:
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
如果您的dba不允许链接的服务器,则可以使用OPENROWSET。 联机丛书将提供您需要的语法。
两个表的连接最好由DBMS完成,所以应该这样做。 您可以在一个数据库上镜像较小的表或其子集,然后join它们。 有人可能会试图做这样的ETL服务器,如informatica,但我猜这是不可取的,如果表是巨大的。
从实际的企业angular度来看,最好的做法是在数据库中创build一个数据库表的镜像副本,然后只需要一个任务/ proc用delta来每隔一小时更新一次。
如果数据库链接选项不可用,则可以采取的另一个path是通过ODBC将表链接到MS Access或Crystal报告等,并在那里进行连接。
我试过下面的代码,它工作正常
SELECT TimeTrackEmployee.StaffID FROM dbo.tblGBSTimeCard AS GBSTimeCard INNER JOIN TimeTrak.dbo.tblEmployee AS TimeTrackEmployee ON GBSTimeCard.[Employee Number] = TimeTrackEmployee.GBSStaffID
你可以试试以下内容:
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等后缀组成。 所以要注意硬编码的查询,并使其更具dynamic性。
方法1:使用同义词在同一台服务器上的数据库之间链接表。
方法2:从每个数据库中分别收集数据,并将其join您的代码中。 您的数据库连接string可以通过数据库或configuration文件成为您的应用程序服务器configuration的一部分。
为此只需按照下面的查询
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
在我写数据库名的地方,你必须定义数据库的名字。 如果你在同一个数据库,所以你不需要定义数据库名称,但是如果你在其他数据库中,你必须提及数据库名称作为path,否则会显示错误。 希望我能让你的工作变得简单