Wie würde ich mehrere Werte (z. B. eine Zahl und eine Zeichenfolge) von einer benutzerdefinierten Funktion in SQL Server zurückgeben?
machen Sie es zu einer Tabellenwertfunktion
siehe hier http://technet.Microsoft.com/en-us/library/ms191165.aspx , Beispiel eingeschlossen
Eine andere Option wäre die Verwendung einer Prozedur mit Ausgabeparametern - Verwenden einer gespeicherten Prozedur mit Ausgabeparametern
Erland Sommarskog hat einen ausführlichen Beitrag zum Weitergeben von Daten in SQL Server, der sich hier befindet:
http://www.sommarskog.se/share_data.html
Er behandelt SQL Server 2000, 2005 und 2008, und es sollte wahrscheinlich im Detail gelesen werden, da die Vor- und Nachteile der einzelnen Methoden ausführlich behandelt werden. Hier sind jedoch die Highlights des Artikels (zeitlich eingefroren ab Juli 2015), um Suchbegriffe bereitzustellen, die für detailliertere Informationen verwendet werden können:
Dieser Artikel befasst sich mit zwei verwandten Fragen:
- Wie kann ich die Ergebnismenge aus einer gespeicherten Prozedur in einer anderen verwenden, auch ausgedrückt als Wie kann ich die Ergebnismenge aus einer gespeicherten verwenden
Prozedur in einer SELECT-Anweisung?- Wie kann ich Tabellendaten in einem Parameter von einer gespeicherten Prozedur an eine andere übergeben?
OUTPUT-Parameter
- Nicht allgemein anwendbar, aber manchmal übersehen.
Tabellenwertfunktionen
- Oft ist die beste Wahl nur für die Ausgabe, es gibt jedoch einige Einschränkungen.
- Beispiele:
- Inline-Funktionen: Verwenden Sie diese Option, um ein einzelnes SELECT wiederzuverwenden.
- Multi-Statement-Funktionen: Wenn Sie komplexere Logik kapseln müssen.
Verwenden einer Tabelle
- Die allgemeinste Lösung. Meine bevorzugte Wahl für Input/Output-Szenarien.
- Beispiele:
- Freigeben einer temporären Tabelle: Hauptsächlich für ein einzelnes Anruferpaar.
- Tabelle mit Prozesstasten: Die beste Wahl für viele Anrufer, die den gleichen Anruf tätigen.
- Globale Tempetabellen: Eine Variation der Prozessschlüssel.
Tabellenwertparameter
- Req. Version: SQL 2008
- Hauptsächlich nützlich, wenn Daten von einem Client übertragen werden.
INSERT-EXEC
- Täuschend ansprechend, sollte aber sparsam eingesetzt werden.
Verwenden der CLR
- Req. Version: SQL 2005
- Komplex, aber als letzter Ausweg nützlich, wenn INSERT-EXEC nicht funktioniert.
OPENQUERY
- Trickig mit vielen Fallstricken. Entmutigt.
Verwenden von XML
- Req. Version: SQL 2005
- Ein bisschen kludge, aber nicht ohne Vorteile.
Cursor-Variablen verwenden
- Nicht zu empfehlen.
Hier ist die Query Analyzer-Vorlage für eine Inline-Funktion - standardmäßig werden 2 Werte zurückgegeben:
-- =============================================
-- Create inline function (IF)
-- =============================================
IF EXISTS (SELECT *
FROM sysobjects
WHERE name = N'<inline_function_name, sysname, test_function>')
DROP FUNCTION <inline_function_name, sysname, test_function>
GO
CREATE FUNCTION <inline_function_name, sysname, test_function>
(<@param1, sysname, @p1> <data_type_for_param1, , int>,
<@param2, sysname, @p2> <data_type_for_param2, , char>)
RETURNS TABLE
AS
RETURN SELECT @p1 AS c1,
@p2 AS c2
GO
-- =============================================
-- Example to execute function
-- =============================================
SELECT *
FROM <owner, , dbo>.<inline_function_name, sysname, test_function>
(<[email protected], , 1>,
<[email protected], , 'a'>)
GO
Als Benutzer Mr. Brownstone
können Sie eine gespeicherte Prozedur verwenden ; um es allen leicht zu machen, habe ich ein minimalistisches Beispiel geschaffen. Zuerst eine gespeicherte Prozedur erstellen :
Create PROCEDURE MultipleOutParameter
@Input int,
@Out1 int OUTPUT,
@Out2 int OUTPUT
AS
BEGIN
Select @Out1 = @Input + 1
Select @Out2 = @Input + 2
Select 'this returns your normal Select-Statement' as Foo
, 'amazing is it not?' as Bar
-- Return can be used to get even more (afaik only int) values
Return(@[email protected][email protected])
END
die gespeicherte Prozedur ausführen einige lokale Variablen werden benötigt, um den Wert zu erhalten:
DECLARE @GetReturnResult int, @GetOut1 int, @GetOut2 int
EXEC @GetReturnResult = MultipleOutParameter
@Input = 1,
@Out1 = @GetOut1 OUTPUT,
@Out2 = @GetOut2 OUTPUT
Um den Inhalt der Werte anzuzeigen, können Sie Folgendes tun
Select @GetReturnResult as ReturnResult, @GetOut1 as Out_1, @GetOut2 as Out_2
Das wird das Ergebnis sein: