In T-SQL, questo è permesso:
DECLARE @SelectedValue int SELECT @SelectedValue = MyIntField FROM MyTable WHERE MyPrimaryKeyField = 1
Quindi, è ansible ottenere il valore di un SELECT e inserirlo in una variabile (a condizione che sia scalare, ovviamente).
Se inserisco la stessa logica di selezione in una stored procedure:
CREATE PROCEDURE GetMyInt AS SELECT MyIntField FROM MyTable WHERE MyPrimaryKeyField = 1
Posso ottenere l’output di questa procedura memorizzata e inserirla in una variabile?
Qualcosa di simile a:
DECLARE @SelectedValue int SELECT @SelectedValue = EXEC GetMyInt
(So che la syntax sopra non è consentita perché l’ho provata!)
ci sono tre modi che puoi usare: il valore RETURN, il parametro OUTPUT e un set di risultati
INOLTRE, fai attenzione se usi il pattern: SELECT @Variable=column FROM table ...
se ci sono più righe restituite dalla query, @Variable conterrà solo il valore dell’ultima riga restituita dalla query.
VALORE DI RITORNO
poiché la tua query restituisce un campo int, almeno in base a come lo hai chiamato. puoi usare questo trucco:
CREATE PROCEDURE GetMyInt ( @Param int) AS DECLARE @ReturnValue int SELECT @ReturnValue=MyIntField FROM MyTable WHERE MyPrimaryKeyField = @Param RETURN @ReturnValue GO
e ora chiama la tua procedura come:
DECLARE @SelectedValue int ,@Param int SET @Param=1 EXEC @SelectedValue = GetMyInt @Param PRINT @SelectedValue
questo funzionerà solo per INT, poiché RETURN può solo restituire un singolo valore int e i valori null vengono convertiti in uno zero.
PARAMETRO DI USCITA
puoi usare un parametro di output:
CREATE PROCEDURE GetMyInt ( @Param int ,@OutValue int OUTPUT) AS SELECT @OutValue=MyIntField FROM MyTable WHERE MyPrimaryKeyField = @Param RETURN 0 GO
e ora chiama la tua procedura come:
DECLARE @SelectedValue int ,@Param int SET @Param=1 EXEC GetMyInt @Param, @SelectedValue OUTPUT PRINT @SelectedValue
I parametri di output possono restituire solo un valore, ma possono essere qualsiasi tipo di dati
RESULT SET per un set di risultati rendere la procedura simile a:
CREATE PROCEDURE GetMyInt ( @Param int) AS SELECT MyIntField FROM MyTable WHERE MyPrimaryKeyField = @Param RETURN 0 GO
usalo come:
DECLARE @ResultSet table (SelectedValue int) DECLARE @Param int SET @Param=1 INSERT INTO @ResultSet (SelectedValue) EXEC GetMyInt @Param SELECT * FROM @ResultSet
i set di risultati possono avere molte righe e molte colonne di qualsiasi tipo di dati
C’è anche una combinazione, puoi usare un valore di ritorno con un recordset:
– Procedura controllata
CREATE PROCEDURE [TestProc] AS BEGIN DECLARE @Temp TABLE ( [Name] VARCHAR(50) ) INSERT INTO @Temp VALUES ('Mark') INSERT INTO @Temp VALUES ('John') INSERT INTO @Temp VALUES ('Jane') INSERT INTO @Temp VALUES ('Mary') -- Get recordset SELECT * FROM @Temp DECLARE @ReturnValue INT SELECT @ReturnValue = COUNT([Name]) FROM @Temp -- Return count RETURN @ReturnValue END
– Codice di chiamata–
DECLARE @SelectedValue int EXEC @SelectedValue = [TestProc] SELECT @SelectedValue
–Results–
Dovresti usare i valori di ritorno.
DECLARE @SelectedValue int CREATE PROCEDURE GetMyInt (@MyIntField int OUTPUT) AS SELECT @MyIntField = MyIntField FROM MyTable WHERE MyPrimaryKeyField = 1
Quindi lo chiami così:
EXEC GetMyInt OUTPUT @SelectedValue
Prova a fare questo:
EXEC @SelectedValue = GetMyInt