Saltar al contenido

¿El proveedor OLE DB “MSOLEDBSQL” con SQL Server no es compatible?

Este equipo de expertos luego de muchos días de investigación y de juntar de información, han obtenido la solución, deseamos que resulte útil para ti para tu trabajo.

Solución:

Parece que ha hecho todo bien. Sin embargo, el enlace que publicó tiene un comentario en la página que dice:

Esta página ya no se mantiene. Lea los detalles a continuación.

Si abre la pestaña de detalles haciendo clic en el + firmar, será recibido con la siguiente información:

Esta página ya no se mantiene. Para descargar Microsoft OLE DB Driver 18 para SQL Server, vaya a la página de documentación en https://aka.ms/downloadmsoledbsql.

Esto lo llevará a https://docs.microsoft.com/en-gb/sql/connect/oledb/download-oledb-driver-for-sql-server?view=sql-server-ver15 (en caso de que el corto enlace se vuelve obsoleto.)

Tomaría los controladores OLE DB más nuevos desde allí.

Controlador Microsoft OLE DB para SQL Server

Tómese su tiempo y lea la información sobre el Diferentes generaciones de controladores OLE DB en la página web. En la subsección titulada 3. Controlador Microsoft OLE DB para SQL Server (MSOLEDBSQL) hay esta pequeña nota que dice:

El nuevo proveedor OLE DB se denomina controlador Microsoft OLE DB para SQL Server (MSOLEDBSQL). El nuevo proveedor se actualizará con las funciones más recientes del servidor en el futuro.

Según lo que escribió en su pregunta, debe utilizar el controlador OLE DB correcto. Bien….


Cree un servidor vinculado desde SQL Server 2019 a SQL Server 2016

Tengo varias instancias en mi computadora portátil y creé un servidor vinculado desde mi instancia de 2019 a una instancia de SQL Server 2016 utilizando los siguientes procedimientos almacenados:

USE [master]
GO
EXEC master.dbo.sp_addlinkedserver 
    @server = N'MSOLEDBDSQL', 
    @srvproduct=N'SERVERsql2016', 
    @provider=N'MSOLEDBSQL', 
    @datasrc=N'SERVERsql2016', 
    @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

Luego consulté al servidor vinculado con la siguiente declaración:

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

Que regresó rápidamente:

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

Parece funcionar bien.

Cree un servidor vinculado desde la instancia de SQL Server 2016 (CI) a la instancia de SQL Server 2016

Luego creé un servidor vinculado desde mi instancia de 2016 que no distingue entre mayúsculas y minúsculas a la misma instancia de SQL Server 2016 utilizando los siguientes procedimientos almacenados:

USE [master]
GO
EXEC master.dbo.sp_addlinkedserver 
    @server = N'MSOLEDBDSQL', 
    @srvproduct=N'SERVERsql2016', 
    @provider=N'MSOLEDBSQL', 
    @datasrc=N'SERVERsql2016', 
    @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

Luego consulté al servidor vinculado en mi instancia de CI con la siguiente declaración:

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

Que regresó rápidamente:

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

Esto parece correlacionarse con lo que está observando … Hmmm. Pensemos en esto.

Posibles Causas

  • La intercalación tiene que ser la misma: CI o CS
  • Los controladores no son totalmente compatibles con 2016 cuando se conectan de una instancia de 2016 a una de 2016.
  • Algo es diferente en la instancia de SQL Server 2019 en comparación con la instancia de SQL Server 2016.

Vayamos y echemos un vistazo al …

Ojbect Explorer | Objetos de servidor | Servidores enlazados | Proveedores | Propiedades de MSOLEDBSQL

Abriremos las propiedades del controlador en la instancia de SQL Server 2019 que utilicé primero:

Controlador Microsoft OLE DB para propiedades de SQL Server en la instancia de 2019

… y las propiedades del controlador en SQL Server 2016 CI que utilicé en mi segunda prueba:

Controlador Microsoft OLE DB para propiedades de SQL Server en la instancia de CI de 2016

Y ahí lo tenemos. La propiedad Permitir en proceso en la instancia configurada de SQL Server 2016 CI no está marcada. La instancia de SQL Server 2019 tiene esta configuración marcada. Cambiémoslo para nuestra instancia de SQL Server 2016 y ejecutemos la consulta. ¡Funciona!

Solución

Asegurar la opción Permitir en proceso está marcado para el Controlador Microsoft OLE DB para SQL Server en sus propiedades en el Servidor vinculado | Proveedores.

OLE DB no estaba disponible y se lanzó en 2018 como MSOLEDBSQL. Las versiones anteriores (y aún en desuso) son SQLOLEDB o SQLNCLI.

Como está utilizando SQL Server 2016, su servidor probablemente no tenga instalado MSOLEDBSQL. Tendrá que instalarlo en el servidor antes de poder usarlo en un servidor vinculado.

Más información, incluido un enlace de descarga, está disponible en los documentos.

Aquí tienes las reseñas y calificaciones

Eres capaz de añadir valor a nuestra información añadiendo tu experiencia en las críticas.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *