wake-up-neo.com

Gibt mehrere Werte aus einer SQL Server-Funktion zurück

Wie würde ich mehrere Werte (z. B. eine Zahl und eine Zeichenfolge) von einer benutzerdefinierten Funktion in SQL Server zurückgeben?

40
Jeremy Stein

machen Sie es zu einer Tabellenwertfunktion

siehe hier http://technet.Microsoft.com/en-us/library/ms191165.aspx , Beispiel eingeschlossen

33
devio

Eine andere Option wäre die Verwendung einer Prozedur mit Ausgabeparametern - Verwenden einer gespeicherten Prozedur mit Ausgabeparametern

15
Rockcoder

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.
9
fordareh

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  
8
dkretz

Beispiel für die Verwendung einer gespeicherten Prozedur mit mehreren Out-Parametern

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 aufrufen

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:

Result of Stored Procedure Call with multiple out parameters

1
surfmuggle