Sql-Server

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

  • May 27, 2021

根據 Microsoft的建議,我一直在使用帶有舊提供程序 (SQLNCLI) 的連結伺服器,沒有任何問題,我打算切換到新的提供程序 (MSOLEDBSQL)。安裝驅動程序後,我可以使用以下 T-SQL 添加連結伺服器

EXEC sp_addlinkedserver     
  @server=N'SQL02\DEV1',   
  @srvproduct=N'',  
  @provider=N'MSOLEDBSQL',   
  @datasrc=N'SQL02,1933';  

不幸的是,當我嘗試查詢新的連結伺服器時出現以下錯誤:

我嘗試過的查詢:

--- 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;

從所有範例中得到相同的錯誤:

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

這是否真的意味著 SQL-2016 不支持使用新的提供程序 MSOLEDBSQL,尤其是在連結伺服器中,或者除了重新安裝驅動程序和重新啟動 SQL Server 之外,我還有什麼遺漏的。

你似乎做對了一切。但是,您發布的連結在頁面上有一條評論,其中指出:

此頁面不再維護。請閱讀以下詳細資訊。

如果您通過點擊**+**號打開詳細資訊選項卡,您將看到以下資訊:

此頁面不再維護。要下載適用於 SQL Server 的 Microsoft OLE DB 驅動程序 18,請轉到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

然後我使用以下語句查詢連結伺服器:

SELECT name, create_date FROM MSOLEDBDSQL.master.sys.databases 

立即返回:

+----------------------+-------------------------+
|         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 |
+----------------------+-------------------------+

似乎工作得很好。

創建從 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

然後,我使用以下語句在我的 CI 實例中查詢連結伺服器:

SELECT name, create_date FROM MSOLEDBDSQL.master.sys.databases 

立即返回:

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

這似乎與您所觀察到的有關……嗯。讓我們考慮一下。

可能的原因

  • 排序規則必須相同:CI 或 CS
  • 從 2016 連接到 2016 實例時,驅動程序不完全兼容 2016。
  • 與 SQL Server 2016 實例相比,SQL Server 2019 實例有所不同。

讓我們去看看…

對象資源管理器 | 伺服器對象 | 連結伺服器 | 供應商 | MSOLEDBSQL 屬性

我們將在我首先使用的 SQL Server 2019 實例上打開驅動程序的屬性:

Microsoft OLE DB Driver for SQL Server Properties 2019 實例

…以及我在第二次測試中使用的 SQL Server 2016 CI 上的驅動程序屬性:

Microsoft OLE DB Driver for SQL Server 2016 CI 實例中的屬性

我們終於得到它了。未勾選 SQL Server 2016 CI 配置實例上的允許程序內屬性。SQL Server 2019 實例已勾選此設置。讓我們為我們的 SQL Server 2016 實例更改它並執行查詢。有用!

解決方案

確保在Linked Server |的屬性中為Microsoft OLE DB Driver for SQL Server勾選了**允許程序內選項。**提供者

引用自:https://dba.stackexchange.com/questions/279226