El problema surge cuando se intenta ejecutar consultas distribuidas usando servidores vinculados desde un servidor de 64 bits (SQL Server 2008 o SQL Server 2005) a otro que sea SQL Server 2000 de 32 bits.
Puede obtener el error:
El proveedor OLE DB "SQLNCLI10" del servidor vinculado "<linkedservername>" devolvió el mensaje "Error no especificado".
El proveedor OLE DB "SQLNCLI10" del servidor vinculado "<linkedservername>" devolvió el mensaje "No se puede encontrar en el servidor el procedimiento almacenado necesario para completar esta operación. Póngase en contacto con el administrador del sistema.".
Mens 7311, Nivel 16, Estado 2, Procedimiento V_OtrasAtenciones, Línea 3
No se puede obtener el conjunto de filas de esquema "DBSCHEMA_TABLES_INFO" para el proveedor OLE DB "SQLNCLI10" del servidor vinculado "<linkedservername>". El proveedor admite la interfaz, pero devuelve un código de error cuando se usa.
El problema y la solución no están en el motor de 64 bits, sino en el SQL 2000 de 32 bits. El error de sintaxis es debido a cuando se realiza una consulta a un procedimiento almacenado, usando el linked Server, lo tratara como si de una tabla se tratase. Si estáis ante este escenario, como ejemplo, podéis ver que SYSREMOTE_CATALOGS es un procedimiento almacenado, no una tabla. Ejecutar "exec sp_help 'SYSREMOTE_CATALOGS' para verlo vosotros mismos.
Para solucionar este problema, si no ha actualizado su SQL Server 2000 a SP3 o SP4, hágalo. Una vez este instalado, nos dejara el script instcat.sql, que debemos ejecutar (en su SQL Server 2000). De forma predeterminada, este script se encontrará en la carpeta c:>Archivos de programa>Microsoft SQL Server>Mssql>Install. Después de ejecutar la secuencia de comandos Instcat.SQL, se generan muchos mensajes. El último mensaje indica si la secuencia de comandos se ejecutó correctamente.
Instcat.sql > También actualizar el catálogo ODBC de procedimientos almacenados en el equipo SQL Server.
Para ejecutar el script instcat.sql puede usar osql. La utilidad osql es una utilidad de símbolo del sistema de Microsoft Windows 32 que puede utilizarse para ejecutar instrucciones de Transact-SQL y archivos de comandos. La utilidad osql utiliza la interfaz de programación de aplicaciones (API) de la base de datos ODBC para comunicarse con el servidor
Os paso a modo de ejemplo como se ejecutaría desde un “CMD”:
Modo con autenticación Windows
Para una instancia predeterminada:
osql -E -S <ServerName> -i <Location>instcat.sql
Para una instancia con nombre:
osql -E -S <ServerName><InstanceName> -i <Location>instcat.sql
Modo con autenticación de SQL Server
Para una instancia predeterminada:
osql -U <AdminLogin> -P <AdminPassword> -S <ServerName> -i <Location>instcat.sql
Para una instancia con nombre:
osql -U <AdminLogin> -P <AdminPassword> -S <ServerName><InstanceName> -i <Location>instcat.sql
Es possible que se produzca algún error durante la ejecución del script instcat.sql, tales como:
En la línea 8320 me muestra el error
Servidor: mensaje 170, nivel 15, estado 31, procedimiento sp_catalogs, línea 7
Línea 7: sintaxis incorrecta cerca de '<'.
Por no tomar la variable <@server_name>, en este caso, sustituirla por el nombre del servidor, en:
…
create procedure sp_catalogs(
@server_name sysname)
as
select
CATALOG_NAME,
convert (nvarchar(255),DESCRIPTION)
from master.dbo.SYSREMOTE_CATALOGS
< @server_name >
order by CATALOG_NAME
go
grant execute on sp_catalogs to public
go
…
Fuentes:
Microsoft
MSDN
…
Apunte y recopilación por Norman M. Pardell
Puedes consultarme, si deseas cualquier aclaración, pregunta o sugerencia en: Contacto, contestaré tan pronto como me sea posible.