通过在不同服务器上的两个数据库中连接两个表来查询数据

Kas*_*hif 89 sql database sql-server sql-server-2005 sql-server-2008

在不同服务器上的两个不同数据库中有两个表,我需要加入它们以便进行少量查询.我有什么选择?我该怎么办?

Sco*_*son 75

您需要使用它sp_addlinkedserver来创建服务器链接.有关用法,请参阅参考文档.建立服务器链接后,您将正常构建查询,只需在数据库名称前加上其他服务器.IE:

-- FROM DB1
SELECT *
FROM [MyDatabaseOnDB1].[dbo].[MyTable] tab1
    INNER JOIN [DB2].[MyDatabaseOnDB2].[dbo].[MyOtherTable] tab2
        ON tab1.ID = tab2.ID
Run Code Online (Sandbox Code Playgroud)

建立链接后,您还可以使用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
Run Code Online (Sandbox Code Playgroud)

查看OPENQUERY文档以查看更多示例.上面的例子非常人为.我肯定会使用此特定示例中的第一个方法,但OPENQUERY如果您使用查询过滤掉某些数据,则使用第二个选项可以节省一些时间和性能.

  • 如果有人在寻找PostgreSQL的答案,请尝试以下操作:http://www.postgresql.org/docs/9.4/static/postgres-fdw.html (2认同)

小智 7

试试这个:

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
Run Code Online (Sandbox Code Playgroud)


HLG*_*GEM 5

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