SQL Server 跨服务器查询指南
跨服务器查询是指在一个 SQL Server 实例中查询另一个 SQL Server 实例(或不同类型的数据库服务器)中的数据,以下是几种实现跨服务器查询的主要方法:

使用链接服务器 (Linked Server)
链接服务器是 SQL Server 提供的最常用的跨服务器查询方法。
创建链接服务器
-- 使用 T-SQL 创建链接服务器
EXEC sp_addlinkedserver
@server = '远程服务器名',
@srvproduct = '',
@provider = 'SQLNCLI', -- 或 'SQLOLEDB' 用于旧版本
@datasrc = '远程服务器地址';
-- 设置登录映射
EXEC sp_addlinkedsrvlogin
@rmtsrvname = '远程服务器名',
@useself = 'false',
@locallogin = NULL, -- 或指定特定本地登录
@rmtuser = '远程用户名',
@rmtpassword = '远程密码';
使用链接服务器查询
-- 四部分名称查询: [服务器名].[数据库名].[架构名].[表名]
SELECT * FROM [远程服务器名].[远程数据库名].[dbo].[表名];
-- 使用 OPENQUERY
SELECT * FROM OPENQUERY([远程服务器名], 'SELECT * FROM [远程数据库名].[dbo].[表名]');
-- 使用 OPENROWSET
SELECT * FROM OPENROWSET(
'SQLNCLI',
'Server=远程服务器地址;UID=用户名;PWD=密码;',
'SELECT * FROM [远程数据库名].[dbo].[表名]'
);
使用 OPENDATASOURCE
SELECT * FROM OPENDATASOURCE(
'SQLNCLI',
'Data Source=远程服务器地址;User ID=用户名;Password=密码'
).[远程数据库名].[dbo].[表名];
使用分布式查询
-- 首先创建链接服务器(同上),然后使用分布式查询 SELECT a.*, b.* FROM [本地服务器].[本地数据库].[dbo].[本地表] a JOIN [远程服务器].[远程数据库].[dbo].[远程表] b ON a.ID = b.ID;
使用分布式事务
如果需要跨服务器执行事务操作:
BEGIN DISTRIBUTED TRANSACTION; -- 执行跨服务器操作 UPDATE [本地服务器].[本地数据库].[dbo].[表1] SET ... UPDATE [远程服务器].[远程数据库].[dbo].[表2] SET ... COMMIT TRANSACTION; -- 或 ROLLBACK TRANSACTION;
注意事项
- 权限设置:确保远程服务器上有适当的权限
- 网络连接:确保两台服务器之间网络畅通
- 性能考虑:跨服务器查询会增加网络开销,尽量减少数据传输量
- 安全性:避免在连接字符串中硬编码密码,考虑使用安全凭据
- 防火墙:确保SQL Server端口(默认1433)在防火墙中开放
管理链接服务器
-- 查看所有链接服务器 SELECT * FROM sys.servers; -- 删除链接服务器 EXEC sp_dropserver @server = '远程服务器名', @droplogins = 'droplogins';
选择哪种方法取决于您的具体需求、安全要求和环境配置,链接服务器是最灵活和常用的方法,而 OPENDATASOURCE 更适合临时查询。

