У меня был запрос с набором параметров, которые нужно было запускать несколько раз с разными параметрами, поэтому я завернул его в функцию, учитывающую таблицу.
Эта функция, требуемая для таблицы, должна быть вызвана с удаленного сервера. К сожалению, вызов сбоя на связанном сервере с ошибкой:
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 или нет, и, как я уже сказал, это происходит только при вызове табличной функции.
Есть идеи, как это решить?