不支持帶有 SQL Server 的 OLE DB 提供程序“MSOLEDBSQL”?
根據 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 實例上打開驅動程序的屬性:
…以及我在第二次測試中使用的 SQL Server 2016 CI 上的驅動程序屬性:
我們終於得到它了。未勾選 SQL Server 2016 CI 配置實例上的允許程序內屬性。SQL Server 2019 實例已勾選此設置。讓我們為我們的 SQL Server 2016 實例更改它並執行查詢。有用!
解決方案
確保在Linked Server |的屬性中為Microsoft OLE DB Driver for SQL Server勾選了**允許程序內選項。**提供者。