连接来自不同服务器的表

Posted

技术标签:

【中文标题】连接来自不同服务器的表【英文标题】:Joining tables from different servers 【发布时间】:2012-02-03 20:47:21 【问题描述】:

关于如何在存储过程中有什么建议吗?

【问题讨论】:

【参考方案1】:

没有更多细节,很难给出直接的例子,但这里是基本的想法:

首先,在存储过程之外,主机服务器(存储过程所在的服务器)必须知道第二个服务器,包括(可能)登录信息。

在您的主服务器上,运行sp_addlinkedserver 存储过程。只需执行一次:

exec sp_addlinkedserver @server='(your second server)';

如果您需要向第二台服务器提供登录信息(例如,该进程无法使用初始数据库连接中使用的相同凭据登录),请使用sp_addlinkedsrvlogin存储过程:

exec sp_addlinkedsrvlogin @rmtsrvname='(your second server)',
@useself=false, 
@rmtuser='yourusername', 
@rmtpassword='yourpassword';

然后,在您的存储过程中,您可以在第二台服务器上指定表:

SELECT table1.*
FROM table1
INNER JOIN [secondserver].[database].[schema].[table] AS table2 ON
    table1.joinfield = table2.joinfield

【讨论】:

【参考方案2】:

1.检查您是否有任何使用exec sp_helpserver的链接服务器

2. 如果您的服务器没有返回,那么它不是Linked,这意味着您需要添加它。 否则转到第 3 步。

对于Sql Server 2008 R2,请转至Server Object > Linked Servers > Add new Linked Server

或者

exec sp_addlinkedserver @server='ServerName'; 

3. 像这样连接到辅助服务器...

exec sp_addlinkedsrvlogin 
@rmtsrvname='ServerName'
, @useself=false
, @rmtuser='user'
, @rmtpassword='Password';

4.现在您可以加入两个不同服务器的表。

SELECT 
    SRV1.*
FROM 
    DB1.database_name.dbo.table_name SRV1
        INNER JOIN DB2.database_name.dbo.table_name SRV2
        ON SRV1.columnId = SRV2.columnId
GO

【讨论】:

【参考方案3】:

在加入表格之前,您必须先链接两个服务器。一旦它们被链接,您可以使用下面的查询并替换服务器、数据库和表名。

记得在 DB2 中执行以下 sql:

EXEC sp_addlinkedserver DB1
GO

-- below statement connects sa account of DB2 to DB1
EXEC sp_addlinkedsrvlogin @rmtsrvname = 'DB1', @useself = 'false', @locallogin = 'sa', @rmtuser = 'sa', @rmtpassword = 'DB1 sa pwd'
GO

SELECT a.columns 
FROM DB1.database_name.dbo.table_name a
INNER JOIN DB2.database_name.dbo.table_name b
ON a.columnId = b.columnId
GO

链接服务器 - http://msdn.microsoft.com/en-us/library/ms188279.aspx

【讨论】:

【参考方案4】:

您可以编写如下语法的查询来加入 SQL Server 中的其他服务器

SELECT table_1.*  
FROM [Database_1].[dbo].[Table_1] table_1
INNER JOIN  [IP_OF_SERVER_2].[Database_2].[dbo].[Table_2] table_2 ON table_1.tablekey COLLATE DATABASE_DEFAULT  = table_2.tablekey COLLATE DATABASE_DEFAULT

p/s: COLLATE DATABASE_DEFAULT 进行编码, 防止波纹管错​​误 无法解决 equal to 操作中“Vietnamese_CI_AS”和“SQL_Latin1_General_CP1_CI_AS”之间的排序规则冲突。

【讨论】:

以上是关于连接来自不同服务器的表的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 4:连接来自不同数据库的表

如何连接来自两个不同 PDO 对象的表?

如何内部连接来自不同数据上下文的表? [复制]

SQLite - 你如何连接来自不同数据库的表?

连接来自两个不同数据库的表

Mysqli 连接来自 2 个不同数据库的表