必须启用 rpc out 选项,否则 EXEC remote_srv.db.dbo.proc 会静默失败或报“Ad hoc access to OLE DB provider has been denied”;还需配置登录映射、使用匹配驱动(如 MSOLEDBSQL)、确保远程访问已启用且服务重启。

必须先启用 rpc out,否则 EXEC remote_srv.db.dbo.proc 会静默失败或报错 “Ad hoc access to OLE DB provider has been denied”。这不是权限或密码问题,是链接服务器默认禁止远程过程调用。
创建链接服务器时要指定正确 provider 和数据源
SQL Server 2017+ 推荐用 'MSOLEDBSQL',别用已弃用的 'SQLOLEDB' 或 'SQLNCLI' —— 后者在新系统上可能根本加载失败。
-
sp_addlinkedserver的@provider参数必须与客户端实际安装的驱动匹配;Windows 身份验证下若用@useself = 'true',得确保 SQL Server 服务账户在远程库有对应登录 - 若远程是 SQL Server 实例,
@srvproduct可为空;但连 Oracle/MySQL 时,@provstr往往比@datasrc更关键,且需按目标数据库要求写连接字符串 - 服务器名(
@server)不能和本地实例名或已有远程服务器重名,否则sp_setnetname也救不了
调用前必须显式配置登录映射和 rpc out 选项
只建链接服务器不等于能执行远程过程 —— 登录映射和 RPC 出口是两个独立开关,缺一不可。
- 用
sp_addlinkedsrvlogin绑定凭据:SQL 账户推荐显式传@rmtuser和@rmtpassword;Windows 身份映射容易因 Kerberos 限制失败,生产环境慎用 - 必须运行
sp_serveroption 'remote_srv', 'rpc out', 'true';图形界面创建的链接服务器默认rpc out = false,这点常被忽略 - 如果还报登录失败,检查
remote access全局配置是否为 1:EXEC sp_configure 'remote access', 1; RECONFIGURE;(改完需重启服务才生效)
远程过程调用语法和常见陷阱
四部分命名法 remote_srv.db.dbo.proc 看似简单,但实际执行路径和本地过程完全不同。
- 参数传递必须严格匹配远程过程定义:
EXEC remote_srv.db.dbo.usp_log @msg = N'hello',不能省略参数名或类型隐式转换 - 远程过程返回的结果集无法直接 INSERT INTO 本地表(除非用
INSERT ... EXEC且远程过程不带事务控制),更稳妥的方式是改用OPENQUERY包装 SELECT - 若远程过程含临时表、动态 SQL 或 SET 选项(如
ANSI_NULLS OFF),很可能因上下文隔离失败而报错,此时应优先考虑把逻辑移到本地或改用 Web API 中间层
最易被忽略的是:即使所有配置都对,远程过程里用了 TRY...CATCH 或未提交事务,也会让调用方卡住或超时——因为链接服务器不参与分布式事务协调,错误不会自动回滚或透传。

















