Обходной путь для удаленного вызова табличной функции в SQL Server имеет еще больше проблем

у меня был запрос с набором параметров, который нужно было запустить несколько раз с разными параметрами, поэтому я завернул его в табличную функцию.

эта функция с табличным значением должна вызываться с удаленного сервера. К сожалению, вызов не выполняется на связанном сервере с ошибкой:

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

Microsoft признала, что" вызов функции с табличным значением удаленно " был функцией, исключенной из SQL Server 2008. Видеть: http://connect.microsoft.com/SQLServer/feedback/details/276758/remote-table-valued-function-calls-are-not-allowed

я обнаружил обходной путь, используя синтаксис OPENQUERY, который позволяет запросу выполняться локально на удаленном сервере, а затем возвращать результирующий набор. Смотрите: http://social.msdn.microsoft.com/Forums/en/transactsql/thread/7a6e4aa1-630b-4ad5-aee5-15139987adbd

к сожалению, этот обходной путь нуждался в обходном пути, потому что он требуется строка в качестве аргумента, то есть вы не можете передать переменную с помощью синтаксиса OPENQUERY, и вы даже не можете объединить строку в ней, например, если вы хотите включить переменные, которые вы хотите передать удаленной табличной функции. Обходной путь для обходного пути-явно построить запрос OPENQUERY с динамическим SQL, гарантируя, что ему передается обычная строка. Видеть: http://social.msdn.microsoft.com/Forums/en-US/transactsql/thread/0847ad24-0dfe-4ae1-9788-5516c7830f40/

тем не менее, еще одна проблема возникает из-за этого. Даже после того, как все кавычки и двойные кавычки и четверные кавычки встроены правильно, поэтому все это может быть передано через exec sp_executesql, по-прежнему существует проблема:

когда запрос в конечном итоге вызывает функцию с табличным значением, я получаю ошибку:

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.

Я не уверен почему я получаю эту ошибку, потому что сопоставление существует для моего имени пользователя, и если я просто заменю табличную функцию фактической таблицей, она вернет результаты в порядке. Проблема возникает с оператором OPENQUERY, независимо от того, выполняется ли он с помощью sp_executesql или нет, и, как я уже сказал, это происходит только при вызове табличной функции.

есть идеи, как это решить?

2 ответов


вы пробовали этот вариант-в основном вы нажимаете вызов функции, чтобы произойти локально на удаленном поле:

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

в случае, если вы не можете решить его, вызвав EXEC (потому что вы вызываете эту функцию из другой функции или пытаетесь сделать что-то вроде INSERT EXEC, но вы не можете вложить его и т. д.), вот workarround, который решил эту проблему для меня:

вы можете создать функцию на локальном сервере, которая выполняет тот же запрос, что и удаленная функция (asuming вы знаете реализацию удаленной функции), так как вы можете получить доступ к таблицам и "статическим функциям" (по openquery) без проблем.

В примере, если удаленная функция что-то вроде этого:

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

вы можете создать функцию на локальном сервере:

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

а потом только запросить новую функцию, как вы хотите...

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

Он должен работать без проблем.