Verwendung von UDF auf Linked Server

Die Verwendung von Linked Server ist eine tolle Sache; macht sie es mir doch leicht, ohne komplizierten erneuten Verbindungsaufbau unmittelbar von meinem Datenbankserver auf Datenbanken anderer Serversysteme zuzugreifen. Die nachfolgenden Codings beschränken sich auf den Zugriff auf SQL Server als Linked Server.

Grundsätzlich lassen sich Objekte, die sich auf einem Linked Server befinden, relativ einfach ansprechen. Sie müssen lediglich die Notation für den Zugriff auf Objekte von Linked Server einhalten. Der Zugriff erfolgt wie eine Wegbeschreibung und setzt sich aus vier Elementen zusammen:

[Server\Instanzname].[Datenbank].[Schema].[Table_Or_View]

Haben Sie zum Beispiel einen Linked Server mit dem Namen [SRV_FINANZ] und benötigen Informationen aus der Gehaltstabelle, die sich in der Datenbank [BUCHHALTUNG] befindet, wäre der Aufruf wie folgt durchzuführen:

SELECT * FROM [SRV_FINANZ].[BUCHHALTUNG].[dbo].[Gehaltstabelle]

Grundsätzlich funktioniert dieser Aufruf nur mit Tabellen / Views. Andere Objekte sind über diese Notationen nicht verfügbar.

Es ist aber nicht auszuschließen, dass z. B. eine UDF (User definied Function) aufgerufen werden muss, da die Entwickler direkten Zugriff auf Tabellen / Views untersagt haben. Dann kann obige Aufrufsyntax leider nicht verwendet werden.

Haben Sie zum Beispiel eine Funktion mit dem Namen fn_GehaltsListe(), die Ihnen eine Liste der aktuellen Gehaltsdaten zurückliefert, würden Sie bei dem Aufruf nach obigem Schema eine Fehlermeldung erhalten.

SELECT [SRV_FINANZ].[BUCHHALTUNG].[dbo].fn_GehaltsListe()
----------------------
Msg 207, Level 16, State 1, Line 1
Invalid Column name '[SRV_FINANZ]'

Der Aufruf wird also von der SQL Engine falsch interpretiert!

Abhilfe schafft jedoch OPENQUERY. Mit OPENQUERY werden Pass Through Abfragen auf Linked Server ausgeführt. Es gilt also immer die Syntax und die Konventionen des Zielservers! OPENQUERY hat jedoch einen Nachteil; sie dürfen keine Variablen als Parameter verwenden.

Für den Zugriff auf die Funktion wird OPENQUERY wie folgt verwendet:

SELECT * FROM OPENQUERY([SRV_FINANZ], 'SELECT [BUCHHALTUNG].[dbo].fn_GehaltsListe()')

Nun wird die Funktion erwartungsgemäß ausgeführt und liefert ein Ergebnis an den Client zurück!

Weiterführende Informationen:

64390 Erzhausen, 20.08.2010
Uwe Ricken
db Berater GmbH