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 驱动程序。
花点时间阅读网页上有关不同代 OLE DB 驱动程序的信息。在标题为3. Microsoft OLE DB Driver for SQL Server (MSOLEDBSQL) 的小节中,有一个小注释指出:
新的 OLE DB 提供程序称为 Microsoft OLE DB Driver for SQL Server (MSOLEDBSQL)。新的提供程序将使用最新的服务器功能进行更新。
根据您在问题中所写的内容,您必须使用正确的 OLE DB 驱动程序。好的....
我的笔记本电脑上有多个实例,并使用以下存储过程创建了从 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)
立即返回:
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 | +----------------------+-------------------------+
似乎工作得很好。
然后,我使用以下存储过程从我的 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)
立即返回:
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
这似乎与您所观察到的有关..... 嗯。让我们考虑一下。
让我们去看看...
我们将在我首先使用的 SQL Server 2019 实例上打开驱动程序的属性:
...以及我在第二次测试中使用的 SQL Server 2016 CI 上的驱动程序属性:
我们终于得到它了。未勾选 SQL Server 2016 CI 配置实例上的Allow inprocess属性。SQL Server 2019 实例已勾选此设置。让我们为 SQL Server 2016 实例更改它并运行查询。有用!
确保选项允许。过程中被选中的微软OLE DB驱动程序的SQL Server将在其属性链接服务器| 供应商。