Die Problemumgehung für den Remoteaufruf von Tabellenwerten in SQL Server weist noch weitere Probleme auf

Ich hatte eine Abfrage mit einer Reihe von Parametern, die mehrere Male mit unterschiedlichen Parametern ausgeführt werden mussten, und habe sie daher in eine Tabellenwertfunktion eingeschlossen.

Diese Tabellenwertfunktion muss von einem Remoteserver aufgerufen werden. Leider schlägt der Aufruf auf dem Verbindungsserver mit dem Fehler fehl:

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

Microsoft hat bestätigt, dass "das Aufrufen einer Tabellenwertfunktion aus der Ferne" eine Funktion war, die in SQL Server 2008 nicht enthalten war. Siehe:http://connect.microsoft.com/SQLServer/feedback/details/276758/remote-table-valued-function-calls- are-not-allowed

Ich habe eine Problemumgehung mithilfe der OPENQUERY-Syntax gefunden, mit der die Abfrage lokal auf dem Remoteserver ausgeführt und anschließend die Ergebnismenge zurückgegeben werden kann. Sehen:http://social.msdn.microsoft.com/Forums/en/transactsql/thread/7a6e4aa1-630b-4ad5-aee5-15139987adbd

Leider war für diese Problemumgehung eine Problemumgehung erforderlich, da eine Zeichenfolge als Argument erforderlich ist. Dies bedeutet, dass Sie mit der OPENQUERY-Syntax keine Variable übergeben und nicht einmal eine Zeichenfolge verketten können, z. B. wenn Sie Variablen einschließen möchten, die Sie verwenden möchten an die ferne Tabellenwertfunktion übergeben. Die Problemumgehung für die Problemumgehung besteht darin, die OPENQUERY-Abfrage explizit mit dynamischem SQL zu erstellen und sicherzustellen, dass eine normale Zeichenfolge an sie übergeben wird. Sehen:http://social.msdn.microsoft.com/Forums/en-US/transactsql/thread/0847ad24-0dfe-4ae1-9788-5516c7830f40/

Daraus ergibt sich noch ein weiteres Problem. Auch wenn sichergestellt ist, dass alle Anführungszeichen und doppelten und vierfachen Anführungszeichen korrekt eingebettet sind, so dass das Ganze über exec sp_executesql weitergeleitet werden kann, gibt es immer noch ein Problem:

Wenn die Abfrage letztendlich die Tabellenwertfunktion aufruft, erhalte ich den Fehler:

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.

Ich bin nicht sicher, warum ich diesen Fehler erhalte, da die Zuordnung für meinen Benutzernamen vorhanden ist und wenn ich die Tabellenwertfunktion einfach durch eine tatsächliche Tabelle ersetze, werden die Ergebnisse in Ordnung zurückgegeben. Das Problem tritt bei der OPENQUERY-Anweisung auf, unabhängig davon, ob sie mit sp_executesql ausgeführt wird oder nicht, und wie gesagt, nur beim Aufrufen einer Tabellenwertfunktion.

Irgendwelche Ideen, wie man das löst?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage