T-SQL ottiene il valore SELEZIONATO della stored procedure

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–

inserisci la descrizione dell'immagine qui

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