Spesso vi è la necessità, in una Stored Procedure, di lavorare con dei valori di ritorno forniti da una altra Stored. Per ottenere ciò esistono tre possibili modalità.
Return Value
All’interno della Stored Procedure posso utilizzare la parola chiave RETURN, per esempio:
CREATE PROCEDURE GetMyInt( @Param int)
AS
DECLARE @ReturnValue int
SELECT @ReturnValue=MyIntField FROM MyTable WHERE MyPrimaryKeyField = @Param
RETURN @ReturnValue
END
In questo modo posso chiamare la procedura come:
DECLARE @SelectedValue int
EXEC @SelectedValue = GetMyInt 999
Questo metodo però ha due importanti limitazioni:
- Il
RETURN
può fornire solo valori interi,NULL
è convertito a 0 e le stringhe forniscono un errore diConversion failed when converting the varchar value to data type int
. - Il metodo può fornire un solo valore di ritorno
Output Parameter
In fase di dichiarazione di una procedura posso dichiararne i parametri di OUTPUT, come nel seguente esempio:
CREATE PROCEDURE GetMyInt( @Param int, @OutValue int OUTPUT)
AS
SELECT @OutValue=MyIntField FROM MyTable WHERE MyPrimaryKeyField = @Param
END
La chiamata avviene nel seguente modo:
DECLARE @SelectedValue int
EXEC GetMyInt 999, @SelectedValue OUTPUT
La differenza fondamentale con il metodo indicato sopra è il valore può essere di qualsiasi tipo, anche se può essere comunque un solo valore.
Result Set
Questo metodo è particolarmente utile quando voglio fornire un rowset come output di una procedura e non un solo valore.
Abbiamo la dichiarazione della procedura nel seguente modo:
CREATE PROCEDURE GetMyInt(@Param int)
AS
SELECT MyIntField FROM MyTable WHERE MyPrimaryKeyField = @Param
END
E’ importante notare di come questa sia la procedura più “spoglia”, non presenta ne un RETURN
ne un OUTPUT
, semplicemente una generica SELECT
.
Per chiamarla scrivo, per esempio:
DECLARE @ResultSet table (SelectedValue int)
INSERT INTO @ResultSet (SelectedValue)
EXEC GetMyInt @Param
SELECT * FROM @ResultSet
Questo metodo risolve entrambe le limitazioni dei metodi precedenti in quanto:
- Posso ritornare un qualsiasi numero di righe
- I valori possono essere di qualsiasi tipo
Questo approccio necessità della creazione della tabella temporanea anche se viene ritornato un solo record.