连接来自不同服务器的表格

23

有什么建议可以在存储过程中连接来自不同服务器的表格吗?

4个回答

28

缺乏更多细节,很难给出直接的示例,但基本思路如下:

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

在您的主服务器上运行 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

1
如果在查询两个表时遇到排序问题,请使用“COLLATE” [SQL关键字](https://learn.microsoft.com/en-us/sql/t-sql/statements/collations?view=sql-server-ver15)与所需的排序一起使用以使其正常工作。 - m4el

8

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

4

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

请记住在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/zh-cn/library/ms188279.aspx


-1

你可以按照以下语法编写查询来在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

提示:使用 COLLATE DATABASE_DEFAULT 进行编码,避免以下错误: 在等于操作中无法解析 "Vietnamese_CI_AS" 和 "SQL_Latin1_General_CP1_CI_AS" 之间的排序冲突。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接