さまざまなパラメーターを使用して複数回実行する必要がある一連のパラメーターを含むクエリがあったため、それをテーブル値関数でラップしました。
そのテーブル値関数は、リモート サーバーから呼び出される必要がありました。残念ながら、リンク サーバーでの呼び出しは次のエラーで失敗します。
Msg 4122, Level 16, State 1, Line 29
Remote table-valued function calls are not allowed.
Microsoft は、"テーブル値関数をリモートで呼び出す" 機能が SQL Server 2008 から除外されていたことを認めています。 - 通話は許可されていません
OPENQUERY 構文を使用する回避策を発見しました。これにより、クエリをリモート サーバー上でローカルに実行し、結果セットを返すことができます。参照: http://social.msdn.microsoft.com/Forums/en/transactsql/thread/7a6e4aa1-630b-4ad5-aee5-15139987adbd
残念ながら、この回避策には回避策が必要でした。これは、引数として文字列が必要なためです。つまり、OPENQUERY 構文を使用して変数を渡すことはできず、変数を含めたい場合のように、その中に文字列を連結することさえできません。リモート テーブル値関数に渡したい。回避策の回避策は、動的 SQL を使用して OPENQUERY クエリを明示的に構築し、通常の文字列が確実に渡されるようにすることです。参照: 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.
ユーザー名のマッピングが存在するため、このエラーが発生する理由がわかりません。テーブル値関数を実際のテーブルに置き換えるだけで、結果が正常に返されます。この問題は、sp_executesql で実行されるかどうかに関係なく、OPENQUERY ステートメントで発生します。前述のとおり、テーブル値関数を呼び出す場合にのみ発生します。
これを解決する方法はありますか?