连接来自不同服务器的表

发布于 2024-12-25 10:50:13 字数 33 浏览 1 评论 0原文

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

Any suggestions how to join tables from different servers in stored procedure?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

洒一地阳光 2025-01-01 10:50:13

如果没有更多细节,很难给出直接的例子,但基本思想如下:

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

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

Without more details, it's hard to give direct examples, but here is the basic idea:

First, outside of the stored procedure, the host server (the server the stored procedure will be on) has to know about the second server, including (possibly) login information.

On your main server, run the sp_addlinkedserver stored procedure. This only has to be done once:

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

If you need to provide login information to this second server (for example, the process can't log in with the same credentials that are used in the initial database connection), do so with the sp_addlinkedsrvlogin stored proc:

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

Then, in your stored procedure, you can specify tables on the second server:

SELECT table1.*
FROM table1
INNER JOIN [secondserver].[database].[schema].[table] AS table2 ON
    table1.joinfield = table2.joinfield
硬不硬你别怂 2025-01-01 10:50:13

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

2. 如果您的服务器未返回,则它不是 链接意味着您需要添加它。 否则请转到步骤 3。

对于 Sql Server 2008 R2,请转到服务器对象 >链接服务器>添加新的链接服务器

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

1. Check to see if you have any linked servers using exec sp_helpserver

2. If your server is not returned then it is not Linked meaning you will need to add it. Otherwise move to step 3.

For Sql Server 2008 R2, go to Server Object > Linked Servers > Add new Linked Server

Or

exec sp_addlinkedserver @server='ServerName'; 

3. Connect to the Secondary server like so...

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

4. Now you can Join the tables for the two different servers.

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
2025-01-01 10:50:13

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

请记住在 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

You have to first link two servers before joining the tables. Once they are linked, you can just use the below query and replace server, database & table names.

Remember to execute the below sql in DB2:

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

Linking servers - http://msdn.microsoft.com/en-us/library/ms188279.aspx

千仐 2025-01-01 10:50:13

您可以编写如下语法的查询来加入 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 进行编码,
防止出现以下错误
无法解决等于操作中“Vietnamese_CI_AS”和“SQL_Latin1_General_CP1_CI_AS”之间的排序规则冲突。

You can write query as below syntax to join other server in 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 to encode,
Prevent bellow error
Cannot resolve the collation conflict between "Vietnamese_CI_AS" and "SQL_Latin1_General_CP1_CI_AS" in the equal to operation.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文