不支持 SQL Server 的 OLE DB 提供程序“MSOLEDBSQL”?

She*_*ola 10 sql-server linked-server sql-server-2016

我一直在使用旧提供程序 (SQLNCLI) 的链接服务器,没有任何问题,正如Microsoft推荐的那样,我计划切换到新提供程序 (MSOLEDBSQL)。安装驱动程序后,我可以使用以下 T-SQL 添加链接服务器

EXEC sp_addlinkedserver     
   @server=N'SQL02\DEV1',   
   @srvproduct=N'',  
   @provider=N'MSOLEDBSQL',   
   @datasrc=N'SQL02,1933';  
Run Code Online (Sandbox Code Playgroud)

不幸的是,当我尝试查询新的链接服务器时出现以下错误:

我试过的查询:

--- example 1
select * from OPENQUERY ([SQL02\DEV1], 'select name from sys.databases');

--- example 2
select name from [SQL02\DEV1].master.sys.databases;


--- example 3 (without linked server dependency)
SELECT c.* FROM OPENROWSET(
      'MSOLEDBSQL'
    , 'Server=SQL02,1933;Database=master;Integrated Security=True;'
    , 'SELECT name FROM sys.databases;'
    ) c;
Run Code Online (Sandbox Code Playgroud)

从所有示例中得到相同的错误:

不支持 OLE DB 提供程序“MSOLEDBSQL”与 SQL Server 的进程外使用。

这是否真的意味着 SQL-2016 不支持使用新的提供程序 MSOLEDBSQL,尤其是在链接服务器中,或者除了重新安装驱动程序和重新启动 SQL Server 之外,我还有什么遗漏。

Joh*_* N. 12

你似乎做对了一切。但是,您发布的链接在页面上有一条评论,其中指出:

此页面不再维护。请阅读以下详细信息。

如果您通过单击+号打开详细信息选项卡,您将看到以下信息:

此页面不再维护。要下载 Microsoft OLE DB Driver 18 for SQL Server,请访问https://aka.ms/downloadmsoledbsql上的文档页面。

这将带您到https://docs.microsoft.com/en-gb/sql/connect/oledb/download-oledb-driver-for-sql-server?view=sql-server-ver15(以防万一链接已过时。)

我会从那里获取最新的 OLE DB 驱动程序。

用于 SQL Server 的 Microsoft OLE DB 驱动程序

花点时间阅读网页上有关不同代 OLE DB 驱动程序的信息。在标题为3. Microsoft OLE DB Driver for SQL Server (MSOLEDBSQL) 的小节中,有一个小注释指出:

新的 OLE DB 提供程序称为 Microsoft OLE DB Driver for SQL Server (MSOLEDBSQL)。新的提供程序将使用最新的服务器功能进行更新。

根据您在问题中所写的内容,您必须使用正确的 OLE DB 驱动程序。好的....


创建从 SQL Server 2019 到 SQL Server 2016 的链接服务器

我的笔记本电脑上有多个实例,并使用以下存储过程创建了从 2019 实例到 SQL Server 2016 实例的链接服务器:

USE [master]
GO
EXEC master.dbo.sp_addlinkedserver 
    @server = N'MSOLEDBDSQL', 
    @srvproduct=N'SERVER\sql2016', 
    @provider=N'MSOLEDBSQL', 
    @datasrc=N'SERVER\sql2016', 
    @catalog=N'master'

GO
EXEC master.dbo.sp_serveroption @server=N'MSOLEDBDSQL', @optname=N'collation compatible', @optvalue=N'false'
GO
EXEC master.dbo.sp_serveroption @server=N'MSOLEDBDSQL', @optname=N'data access', @optvalue=N'true'
GO
EXEC master.dbo.sp_serveroption @server=N'MSOLEDBDSQL', @optname=N'dist', @optvalue=N'false'
GO
EXEC master.dbo.sp_serveroption @server=N'MSOLEDBDSQL', @optname=N'pub', @optvalue=N'false'
GO
EXEC master.dbo.sp_serveroption @server=N'MSOLEDBDSQL', @optname=N'rpc', @optvalue=N'false'
GO
EXEC master.dbo.sp_serveroption @server=N'MSOLEDBDSQL', @optname=N'rpc out', @optvalue=N'false'
GO
EXEC master.dbo.sp_serveroption @server=N'MSOLEDBDSQL', @optname=N'sub', @optvalue=N'false'
GO
EXEC master.dbo.sp_serveroption @server=N'MSOLEDBDSQL', @optname=N'connect timeout', @optvalue=N'0'
GO
EXEC master.dbo.sp_serveroption @server=N'MSOLEDBDSQL', @optname=N'collation name', @optvalue=null
GO
EXEC master.dbo.sp_serveroption @server=N'MSOLEDBDSQL', @optname=N'lazy schema validation', @optvalue=N'false'
GO
EXEC master.dbo.sp_serveroption @server=N'MSOLEDBDSQL', @optname=N'query timeout', @optvalue=N'0'
GO
EXEC master.dbo.sp_serveroption @server=N'MSOLEDBDSQL', @optname=N'use remote collation', @optvalue=N'true'
GO
EXEC master.dbo.sp_serveroption @server=N'MSOLEDBDSQL', @optname=N'remote proc transaction promotion', @optvalue=N'true'
GO
USE [master]
GO
EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname = N'MSOLEDBDSQL', @locallogin = NULL , @useself = N'True'
GO
Run Code Online (Sandbox Code Playgroud)

然后我使用以下语句查询链接服务器:

SELECT name, create_date FROM MSOLEDBDSQL.master.sys.databases 
Run Code Online (Sandbox Code Playgroud)

立即返回:

+----------------------+-------------------------+
|         name         |       create_date       |
+----------------------+-------------------------+
| master               | 2003-04-08 09:13:36.390 |
| tempdb               | 2020-11-03 16:29:26.787 |
| model                | 2003-04-08 09:13:36.390 |
| msdb                 | 2016-04-30 00:46:38.773 |
| SSODB                | 2020-01-03 14:35:34.143 |
| BizTalkMgmtDb        | 2020-01-03 14:35:39.570 |
| BizTalkDTADb         | 2020-01-03 14:35:43.370 |
| BizTalkMsgBoxDb      | 2020-01-03 14:35:45.137 |
| BizTalkRuleEngineDb  | 2020-01-03 14:36:21.603 |
| BAMPrimaryImport     | 2020-01-03 14:36:34.713 |
| BAMArchive           | 2020-01-03 14:36:35.333 |
| DemoDB               | 2020-01-15 12:04:41.427 |
| BAMAlertsApplication | 2020-01-28 14:40:20.767 |
+----------------------+-------------------------+
Run Code Online (Sandbox Code Playgroud)

似乎工作得很好。

创建从 SQL Server 2016 (CI) 实例到 SQL Server 2016 实例的链接服务器

然后,我使用以下存储过程从我的 2016 年不区分大小写的实例到同一个 SQL Server 2016 实例创建了一个链接服务器:

USE [master]
GO
EXEC master.dbo.sp_addlinkedserver 
    @server = N'MSOLEDBDSQL', 
    @srvproduct=N'SERVER\sql2016', 
    @provider=N'MSOLEDBSQL', 
    @datasrc=N'SERVER\sql2016', 
    @catalog=N'master'

GO
EXEC master.dbo.sp_serveroption @server=N'MSOLEDBDSQL', @optname=N'collation compatible', @optvalue=N'false'
GO
EXEC master.dbo.sp_serveroption @server=N'MSOLEDBDSQL', @optname=N'data access', @optvalue=N'true'
GO
EXEC master.dbo.sp_serveroption @server=N'MSOLEDBDSQL', @optname=N'dist', @optvalue=N'false'
GO
EXEC master.dbo.sp_serveroption @server=N'MSOLEDBDSQL', @optname=N'pub', @optvalue=N'false'
GO
EXEC master.dbo.sp_serveroption @server=N'MSOLEDBDSQL', @optname=N'rpc', @optvalue=N'false'
GO
EXEC master.dbo.sp_serveroption @server=N'MSOLEDBDSQL', @optname=N'rpc out', @optvalue=N'false'
GO
EXEC master.dbo.sp_serveroption @server=N'MSOLEDBDSQL', @optname=N'sub', @optvalue=N'false'
GO
EXEC master.dbo.sp_serveroption @server=N'MSOLEDBDSQL', @optname=N'connect timeout', @optvalue=N'0'
GO
EXEC master.dbo.sp_serveroption @server=N'MSOLEDBDSQL', @optname=N'collation name', @optvalue=null
GO
EXEC master.dbo.sp_serveroption @server=N'MSOLEDBDSQL', @optname=N'lazy schema validation', @optvalue=N'false'
GO
EXEC master.dbo.sp_serveroption @server=N'MSOLEDBDSQL', @optname=N'query timeout', @optvalue=N'0'
GO
EXEC master.dbo.sp_serveroption @server=N'MSOLEDBDSQL', @optname=N'use remote collation', @optvalue=N'true'
GO
EXEC master.dbo.sp_serveroption @server=N'MSOLEDBDSQL', @optname=N'remote proc transaction promotion', @optvalue=N'true'
GO
USE [master]
GO
EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname = N'MSOLEDBDSQL', @locallogin = NULL , @useself = N'True'
GO
Run Code Online (Sandbox Code Playgroud)

然后我使用以下语句查询 CI 实例中的链接服务器:

SELECT name, create_date FROM MSOLEDBDSQL.master.sys.databases 
Run Code Online (Sandbox Code Playgroud)

立即返回:

Msg 7430, Level 16, State 3, Line 1
Out-of-process use of OLE DB provider "MSOLEDBSQL" with SQL Server is not supported.

Completion time: 2020-11-05T13:41:43.0333451+01:00
Run Code Online (Sandbox Code Playgroud)

这似乎与您所观察到的有关..... 嗯。让我们考虑一下。

可能的原因

  • 排序规则必须相同:CI 或 CS
  • 从 2016 年连接到 2016 年实例时,驱动程序不完全兼容 2016 年。
  • 与 SQL Server 2016 实例相比,SQL Server 2019 实例有所不同。

让我们去看看...

对象浏览器 | 服务器对象 | 链接服务器 | 供应商 | MSOLEDBSQL 属性

我们将在我首先使用的 SQL Server 2019 实例上打开驱动程序的属性:

Microsoft OLE DB Driver for SQL Server Properties in 2019 实例

...以及我在第二次测试中使用的 SQL Server 2016 CI 上的驱动程序属性:

Microsoft OLE DB Driver for SQL Server Properties in 2016 CI 实例

我们终于得到它了。未勾选 SQL Server 2016 CI 配置实例上的Allow inprocess属性。SQL Server 2019 实例已勾选此设置。让我们为 SQL Server 2016 实例更改它并运行查询。有用!

解决方案

确保选项允许。过程中被选中的微软OLE DB驱动程序的SQL Server将在其属性链接服务器| 供应商

  • 这太不可思议了——这解决了问题!多谢!!!! (2认同)