在SQL Server的业务开发中,经常会遇到需要操作其他服务器上数据库的场景,通过Linked Server(链接服务器)可以快速建立跨服务器的连接,进而在存储过程中执行远程服务器的SQL语句,实现跨实例的数据查询、修改等操作。

一、创建并配置Linked Server
要使用Linked Server执行远程SQL,首先需要完成链接服务器的创建和权限配置,操作步骤如下:
1. 使用SSMS图形化创建
打开SQL Server Management Studio,连接到本地SQL Server实例,在对象资源管理器中展开服务器对象,右键点击链接服务器,选择新建链接服务器。
- 在常规页签,填写链接服务器名称,选择服务器类型为SQL Server,输入远程服务器的地址、端口。
- 在安全性页签,选择使用此安全上下文进行连接,输入远程服务器的登录账号和密码,同时勾选为可以连接到此链接服务器的登录名映射本地登录名,添加本地需要使用的登录名并映射到远程服务器的对应账号。
- 在服务器选项页签,将RPC和RPC Out的值设置为True,这两个选项决定了是否允许从本地向远程服务器发起远程过程调用,是执行远程SQL的必要条件。
2. 使用T-SQL语句创建
也可以通过SQL语句快速创建Linked Server,示例代码如下:
-- 创建链接服务器
EXEC sp_addlinkedserver
@server = N'RemoteSQLServer', -- 链接服务器名称,自定义即可
@srvproduct = N'SQL Server'; -- 产品名称,SQL Server填写该值
-- 配置链接服务器登录信息
EXEC sp_addlinkedsrvlogin
@rmtsrvname = N'RemoteSQLServer', -- 对应上面创建的链接服务器名称
@useself = N'False',
@locallogin = NULL, -- 本地登录名,NULL表示所有本地登录都使用该映射
@rmtuser = N'remote_login', -- 远程服务器登录账号
@rmtpassword = N'remote_password'; -- 远程服务器登录密码
-- 开启RPC和RPC Out选项
EXEC sp_serveroption
@server = N'RemoteSQLServer',
@optname = N'rpc',
@optvalue = N'true';
EXEC sp_serveroption
@server = N'RemoteSQLServer',
@optname = N'rpc out',
@optvalue = N'true';
二、在存储过程中执行远程SQL的方法
完成Linked Server配置后,就可以在存储过程中通过链接服务器名称引用远程对象,执行远程SQL语句,常见有两种实现方式。
1. 直接引用远程对象执行查询
格式为[链接服务器名称].[远程数据库名称].[架构名].[表名],可以直接在存储过程中编写查询语句,示例如下:
CREATE PROCEDURE GetRemoteUserData
@UserId INT
AS
BEGIN
SET NOCOUNT ON;
-- 查询远程服务器的用户数据
SELECT UserId, UserName, UserEmail
FROM [RemoteSQLServer].[UserDB].[dbo].[UserInfo] -- RemoteSQLServer是链接服务器名称
WHERE UserId = @UserId;
END
GO
2. 使用OPENQUERY执行远程SQL
如果需要执行更复杂的远程SQL,或者希望SQL语句在远程服务器本地执行,可以使用OPENQUERY函数,该函数会将查询语句发送到远程服务器执行,返回结果到本地,示例如下:
CREATE PROCEDURE UpdateRemoteUserStatus
@UserId INT,
@Status INT
AS
BEGIN
SET NOCOUNT ON;
-- 使用OPENQUERY执行远程更新语句
DECLARE @RemoteSql NVARCHAR(1000);
SET @RemoteSql = N'UPDATE [UserDB].[dbo].[UserInfo] SET Status = ' + CAST(@Status AS NVARCHAR) + ' WHERE UserId = ' + CAST(@UserId AS NVARCHAR);
-- OPENQUERY的第一个参数是链接服务器名称,第二个参数是要执行的远程SQL
EXEC OPENQUERY([RemoteSQLServer], @RemoteSql);
END
GO
3. 执行远程存储过程
如果需要调用远程服务器上的存储过程,也可以通过Linked Server直接调用,示例代码如下:
CREATE PROCEDURE CallRemoteProcedure
@OrderId INT
AS
BEGIN
SET NOCOUNT ON;
-- 调用远程服务器的存储过程
EXEC [RemoteSQLServer].[OrderDB].[dbo].[sp_ProcessOrder] @OrderId;
END
GO
三、常见问题与注意事项
- 权限问题:如果执行远程SQL时提示权限不足,需要检查链接服务器配置的远程账号是否有对应数据库的操作权限,同时本地执行存储过程的账号需要有链接服务器的访问权限。
- 数据类型兼容性:跨服务器传输数据时,注意不同服务器之间的数据类型兼容性,避免隐式转换导致的错误。
- 性能问题:如果查询数据量较大,优先使用
OPENQUERY让查询在远程服务器执行后再返回结果,减少网络传输的数据量,提升执行效率。 - 链接服务器状态检查:可以通过
SELECT * FROM sys.servers语句查看当前所有链接服务器的状态,确认链接服务器是否正常运行。
四、验证Linked Server可用性
在编写存储过程之前,可以先验证链接服务器是否可以正常连接,执行以下测试语句:
-- 测试链接服务器是否可用,能返回结果说明连接正常 SELECT * FROM OPENQUERY([RemoteSQLServer], 'SELECT @@VERSION');
如果上述语句能正常返回远程服务器的版本信息,说明Linked Server配置正确,接下来就可以在存储过程中正常使用远程SQL执行功能了。
SQL_ServerLinked_Server存储过程远程SQL执行修改时间:2026-06-24 08:27:38