Domanda

Come restituirei più valori (ad esempio un numero e una stringa) da una funzione definita dall'utente in SQL Server?

È stato utile?

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:

Risultato della chiamata di procedura memorizzata con più parametri di uscita

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top