2011-02-28 115 views

回答

60

您需要使用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的第二个选项可以节省一些时间和性能。

+1

是否可以使用php-mysql ..如果是的话你能否给我一个建议,我该如何使用这个选项增长? – Jhanvi 2012-09-26 08:47:26

+1

我不知道MySQL是否支持链接服务器。这个答案是特定于Microsoft SQL服务器的。 – 2012-10-04 18:40:59

+0

如果有人正在寻找一个PostgreSQL的答案,试试这个:http://www.postgresql.org/docs/9.4/static/postgres-fdw.html – PJSCopeland 2015-01-19 22:27:48

4

如果您的dba不允许链接的服务器,则可以使用OPENROWSET。联机丛书将提供您需要的语法。

1

两个表的连接最好由DBMS完成,所以应该这样做。您可以在其中一个数据库上镜像较小的表或其子集,然后加入它们。有人可能会试图在ETL服务器上这样做,比如informatica,但如果表格很大,我认为它不可取。

1

从实际的企业角度来看,最好的做法是在数据库中创建数据库表的镜像副本,然后只需要一个任务/ proc用delta每小时更新一次。

8

试试这个:

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 
1

我想下面这段代码和它的正常工作

SELECT  TimeTrackEmployee.StaffID 
FROM   dbo.tblGBSTimeCard AS GBSTimeCard INNER JOIN 
         TimeTrak.dbo.tblEmployee AS TimeTrackEmployee ON GBSTimeCard.[Employee Number] = TimeTrackEmployee.GBSStaffID 
1

如果数据库链接选项不可用,你可以采取另一种途径是通过链接表ODBC到MS Access或Crystal报告等,并在那里进行连接。

0

你可以尝试以下方法:

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 
0

也许硬编码的数据库名称不是一个SQL查询中始终是最好的办法。因此,添加同义词将是更好的方法。并非所有数据库在多个分段环境中都具有相同的名称。它们可能由PROD,UAT,SIT,QA等后缀组成。因此,请注意硬编码查询并使其更具动态性。方法#1:使用同义词在同一台服务器上的数据库之间链接表。

方法2:从每个数据库中分别收集数据并将其加入您的代码中。您的数据库连接字符串可以通过数据库或配置文件成为应用服务器配置的一部分。

0

这个只要按照以下查询

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 

我在哪里写的数据库名称,你必须定义的数据库的名称。如果你在同一个数据库中,所以你不需要定义数据库名称,但是如果你在其他数据库中,你必须提及数据库名称作为路径,否则它会显示错误。 希望我让你的工作变得简单

相关问题