连接来自不同服务器的表
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”之间的排序规则冲突。
【讨论】:
以上是关于连接来自不同服务器的表的主要内容,如果未能解决你的问题,请参考以下文章