Dies ist eine Antwort auf eine leicht abgewandelte Version Ihrer Frage. Wenn Sie auf die Verwendung einer gespeicherten Prozedur für eine benutzerdefinierte Funktion verzichten können, können Sie eine benutzerdefinierte Funktion mit Inline-Tabellenwert verwenden. Dabei handelt es sich im Wesentlichen um eine gespeicherte Prozedur (mit Parametern), die eine Tabelle als Ergebnismenge zurückgibt und sich daher gut mit einer INTO-Anweisung kombinieren lässt.
Hier ist eine gute schneller Artikel und andere benutzerdefinierte Funktionen. Wenn Sie dennoch eine gespeicherte Prozedur benötigen, können Sie die benutzerdefinierte Inline-Tabellenfunktion mit einer gespeicherten Prozedur umhüllen. Die gespeicherte Prozedur übergibt nur Parameter, wenn sie select * von der benutzerdefinierten Funktion mit Tabellenwert aufruft.
So könnten Sie zum Beispiel eine benutzerdefinierte Funktion mit Tabellenwerten einbinden, um eine Liste von Kunden für eine bestimmte Region zu erhalten:
CREATE FUNCTION CustomersByRegion
(
@RegionID int
)
RETURNS TABLE
AS
RETURN
SELECT *
FROM customers
WHERE RegionID = @RegionID
GO
Sie können dann diese Funktion aufrufen, um Ihre Ergebnisse zu erhalten:
SELECT * FROM CustomersbyRegion(1)
Oder um ein SELECT INTO auszuführen:
SELECT * INTO CustList FROM CustomersbyRegion(1)
Wenn Sie dennoch eine gespeicherte Prozedur benötigen, dann verpacken Sie die Funktion als solche:
CREATE PROCEDURE uspCustomersByRegion
(
@regionID int
)
AS
BEGIN
SELECT * FROM CustomersbyRegion(@regionID);
END
GO
Meiner Meinung nach ist dies die "hack-loseste" Methode, um die gewünschten Ergebnisse zu erzielen. Sie verwendet die vorhandenen Funktionen so, wie sie ohne zusätzliche Komplikationen verwendet werden sollen. Durch die Verschachtelung der benutzerdefinierten Inline-Tabellenfunktion in der gespeicherten Prozedur haben Sie auf zwei Arten Zugriff auf die Funktionalität. Plus! Sie haben nur einen Wartungspunkt für den eigentlichen SQL-Code.
Die Verwendung von OPENROWSET wurde vorgeschlagen, aber dafür ist die Funktion OPENROWSET nicht gedacht (From Books Online):
Enthält alle Verbindungsinformationen die erforderlich sind, um auf entfernte Daten von einer OLE DB-Datenquelle zuzugreifen. Diese Methode ist eine Alternative zum Zugriff auf Tabellen in einem verknüpften Server und ist eine einmalige Ad-hoc-Methode zur Verbindung und Zugriff auf entfernte Daten mit Hilfe von OLE DB. Für häufigere Verweise auf OLE DB-Datenquellen, verwenden Sie stattdessen verknüpfte Server stattdessen.
Die Verwendung von OPENROWSET erledigt die Aufgabe, verursacht aber zusätzlichen Overhead für das Öffnen lokaler Verbindungen und das Marshalling von Daten. Sie ist auch nicht in allen Fällen eine Option, da sie eine Ad-hoc-Abfrageerlaubnis erfordert, die ein Sicherheitsrisiko darstellt und daher möglicherweise nicht erwünscht ist. Außerdem schließt der OPENROWSET-Ansatz die Verwendung von gespeicherten Prozeduren aus, die mehr als eine Ergebnismenge zurückgeben. Dies kann erreicht werden, indem mehrere benutzerdefinierte Inline-Tabellenwert-Funktionen in eine einzige Stored Procedure eingeschlossen werden.