través tipo servidor remota puede ningun motor manager internet error encontro datos configurar conexion conectarse conectar sql-server-2008 permissions linked-server openquery sp-executesql

sql-server-2008 - tipo - no se puede conectar a local sql server 2008



La solución para llamar a la función de valor de tabla de forma remota en SQL Server tiene aún más problemas (2)

Tuve una consulta con un conjunto de parámetros que necesitaban ejecutarse varias veces con diferentes parámetros, así que lo envolví en una función con valores de tabla.

Esa tabla valoró la función necesitada desde un servidor remoto. Desafortunadamente, la llamada falla en el servidor vinculado con el error:

Msg 4122, Level 16, State 1, Line 29 Remote table-valued function calls are not allowed.

Microsoft ha reconocido que "llamar a una función con valores de tabla de forma remota" era una característica que quedaba fuera de SQL Server 2008. Ver: http://connect.microsoft.com/SQLServer/feedback/details/276758/remote-table-valued-function -calls-are-not-allowed

Descubrí una solución utilizando la sintaxis OPENQUERY, que permite que la consulta se ejecute localmente en el servidor remoto y luego devuelva el conjunto de resultados. Ver: http://social.msdn.microsoft.com/Forums/en/transactsql/thread/7a6e4aa1-630b-4ad5-aee5-15139987adbd

Desafortunadamente, esta solución alternativa necesitó una solución, porque requiere una cadena como argumento, lo que significa que no puede pasar una variable usando la sintaxis OPENQUERY y ni siquiera puede concatenar una cadena en ella, como si desea incluir variables que usted quiere pasar a la función de valor de tabla remota. La solución para la solución temporal es crear explícitamente la consulta OPENQUERY con SQL dinámico, lo que garantiza que se le pase una cadena normal. Ver: http://social.msdn.microsoft.com/Forums/en-US/transactsql/thread/0847ad24-0dfe-4ae1-9788-5516c7830f40/

Aún así, otro problema resulta de esto. Incluso después de asegurarse de que todas las comillas, las comillas dobles y las comillas cuádruples estén incrustadas correctamente para que todo pueda pasar a través de exec sp_executesql, todavía hay un problema:

Cuando la consulta finalmente llama a la función de valor de tabla, obtengo el error:

OLE DB provider "SQLNCLI10" for linked server "MY_REMOTE_SERVER_NAME" returned message "Deferred prepare could not be completed.". Msg 7416, Level 16, State 1, Procedure MyTableValuedFunctionName, Line 22 Access to the remote server is denied because no login-mapping exists.

No estoy seguro de por qué recibo este error, porque la asignación existe para mi nombre de usuario, y si simplemente reemplazo la función con valores de tabla con una tabla real, devuelve los resultados correctamente. El problema ocurre con la instrucción OPENQUERY, independientemente de si se ejecuta con sp_executesql o no, y como dije, solo ocurre cuando se llama a una función con valores de tabla.

¿Alguna idea de como resolver esto?


¿Has probado esta variación? Básicamente presionas la llamada a la función para que ocurra localmente en el cuadro remoto:

EXEC REMOTE_SERVER_NAME.db_name..sp_executesql N''SELECT * FROM dbo.MyTableValuedFunctionName();'';


En caso de que no pueda resolverlo llamando a un EXEC (porque está llamando a esta función desde otra función o está intentando hacer algo como INSERTAR EXEC pero no puede anidarlo, etc.), aquí hay una solución eso resolvió este problema para mí:

Puede crear una función en su servidor local que ejecute la misma consulta que la función remota (asumiendo que conoce la implementación de la función remota) ya que puede acceder a las tablas y "static-called-functions" (por openquery) sin problemas.

Por ejemplo, si la función remota es algo como esto:

CREATE FUNCTION dbo.[remote_function] (@param1 varchar(200)) RETURNS TABLE AS RETURN ( SELECT col1, col2, col3 FROM [remote_db].[dbo].[remote_table] where col1 = @param1) GO

Puede crear una función en su servidor local:

CREATE FUNCTION dbo.[local_function] (@param1 varchar(200)) RETURNS TABLE AS RETURN ( SELECT col1, col2, col3 FROM [remote_server].[remote_db].[dbo].[remote_table] where col1 = @param1) GO

Y luego solo consulta tu nueva función como quieras ...

SELECT col1, col2, col3 FROM dbo.local_function(@param1); GO

Debería funcionar sin problemas.