Restituisce più valori da una funzione di SQL Server
-
07-07-2019 - |
Domanda
Come restituirei più valori (ad esempio un numero e una stringa) da una funzione definita dall'utente in SQL Server?
Soluzione
rende una funzione con valori di tabella
vedi qui http://technet.microsoft.com/en-us/ library / ms191165.aspx , esempio incluso
Altri suggerimenti
Un'altra opzione sarebbe quella di utilizzare una procedura con parametri di output - Utilizzo di una procedura memorizzata con parametri di output
Erland Sommarskog ha un post esauriente sul passaggio dei dati in SQL Server che si trova qui:
http://www.sommarskog.se/share_data.html
Copre SQL Server 2000, 2005 e 2008 e probabilmente dovrebbe essere letto in tutti i suoi dettagli in quanto vi è un'ampia copertura dei vantaggi e degli svantaggi di ciascun metodo. Tuttavia, ecco i punti salienti dell'articolo (congelati nel tempo a partire da luglio 2015) per fornire termini di ricerca che possono essere utilizzati per avere maggiori dettagli:
Questo articolo affronta due domande correlate:
- Come posso usare il set di risultati da una procedura memorizzata in un'altra, espressa anche come Come posso usare il set di risultati da una stored procedure
procedura in un'istruzione SELECT?- Come posso passare i dati di una tabella in un parametro da una procedura memorizzata a un'altra?
Parametri OUTPUT
- Non generalmente applicabile, ma a volte trascurato.
Funzioni con valori di tabella
- Spesso la scelta migliore solo per l'output, ma ci sono diverse restrizioni.
- Esempi:
- Funzioni incorporate: utilizzate questa opzione per riutilizzare un singolo SELECT.
- Funzioni multiistruzione: quando è necessario incapsulare una logica più complessa.
Uso di una tabella
- La soluzione più generale. La mia scelta preferita per gli scenari di input / output.
- Esempi:
- Condivisione di una tabella temporanea: principalmente per una singola coppia di chiamanti / chiamate.
- Tabella con chiave di processo: la scelta migliore per molti chiamanti della stessa chiamata.
- Tabelle temporanee globali: una variante della chiave di processo.
Parametri con valori di tabella
- Req. Versione: SQL 2008
- Principalmente utile quando si passano dati da un client.
INSERT-EXEC
- Ingannevolmente attraente, ma dovrebbe essere usato con parsimonia.
Uso del CLR
- Req. Versione: SQL 2005
- Complesso, ma utile come ultima risorsa quando INSERT-EXEC non funziona.
OPENQUERY
- Ingannevole con molte insidie. Scoraggiato.
Uso di XML
- Req. Versione: SQL 2005
- Un po 'difficile, ma non privo di vantaggi.
Uso delle variabili del cursore
- Non raccomandabile.
Ecco il modello di Query Analyzer per una funzione in-line: restituisce 2 valori per impostazione predefinita:
-- =============================================
-- 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>
(<value_for_@param1, , 1>,
<value_for_@param2, , 'a'>)
GO
Esempio di utilizzo di una procedura memorizzata con più parametri di uscita
Come utente Mr. Brownstone
ha suggerito che puoi utilizzare una procedura memorizzata ; per renderlo facile per tutti ho creato un esempio minimalista. Innanzitutto creare una procedura memorizzata :
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(@Out1+@Out2+@Input)
END
Chiamata della procedura memorizzata
Per eseguire la procedura memorizzata alcuni variabili locali sono necessarie per ricevere il valore:
DECLARE @GetReturnResult int, @GetOut1 int, @GetOut2 int
EXEC @GetReturnResult = MultipleOutParameter
@Input = 1,
@Out1 = @GetOut1 OUTPUT,
@Out2 = @GetOut2 OUTPUT
Per visualizzare il contenuto dei valori è possibile effettuare le seguenti operazioni
Select @GetReturnResult as ReturnResult, @GetOut1 as Out_1, @GetOut2 as Out_2
Questo sarà il risultato: