根据 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 之外,我还有什么遗漏的。
你似乎做对了一切。但是,您发布的链接在页面上有一条评论,其中指出:
如果您通过单击+号打开详细信息选项卡,您将看到以下信息:
这将带您到https://learn.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 驱动程序。好的....
创建从 SQL Server 2019 到 SQL Server 2016 的链接服务器
我的笔记本电脑上有多个实例,并使用以下存储过程创建了一个从我的 2019 实例到 SQL Server 2016 实例的链接服务器:
然后我使用以下语句查询链接服务器:
立即返回:
似乎工作得很好。
创建从 SQL Server 2016 (CI) 实例到 SQL Server 2016 实例的链接服务器
然后,我使用以下存储过程从我的 2016 年不区分大小写的实例到相同的 SQL Server 2016 实例创建了一个链接服务器:
然后,我使用以下语句在我的 CI 实例中查询链接服务器:
立即返回:
这似乎与您所观察到的有关......嗯。让我们考虑一下。
可能的原因
让我们去看看...
对象资源管理器 | 服务器对象 | 链接服务器 | 供应商 | 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勾选了允许进程内选项。提供者。
OLE DB 已被 弃用,并于 2018 年作为 MSOLEDBSQL 发布。以前的(并且仍然不推荐使用的)版本是 SQLOLEDB 或 SQLNCLI。
当您使用 SQL Server 2016 时,您的服务器可能没有安装 MSOLEDBSQL。您必须先在服务器上安装它,然后才能在链接服务器上使用它。
文档中提供了更多信息,包括下载链接。