T-SQL ottiene il valore SELEZIONATO della procedura memorizzata


95

In T-SQL, ciò è consentito:

DECLARE @SelectedValue int
SELECT @SelectedValue = MyIntField FROM MyTable WHERE MyPrimaryKeyField = 1

Quindi, è possibile 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 sintassi sopra non è consentita perché l'ho provata!)

Risposte:


191

ci sono tre modi in cui puoi usare: il valore RETURN, il parametro OUTPUT e un set di risultati

INOLTRE, fai attenzione se usi lo schema: SELECT @Variable=column FROM table ...

se sono presenti più righe restituite dalla query, la @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, perché RETURN può restituire solo un singolo valore int e i valori null vengono convertiti in zero.

PARAMETRO DI USCITA
è possibile utilizzare un parametro di uscita:

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 effettua la procedura come:

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


5
Notare che l'approccio del set di risultati richiede questo utilizzo di tabella / inserimento, anche se viene restituito un solo record. Stavo cercando un collegamento direttamente in una variabile, ma non ce n'è uno.
goodeye

è possibile utilizzare l'approccio "valore di ritorno" e "parametro di output" nel risultato di più righe?
ji-ruh

@ ji-ruh, una stored procedure può utilizzarne uno, nessuno, alcuni o tutti: set di risultati, parametri di output restituiti e / o valore restituito
KM.

4

C'è anche una combinazione, puoi usare un valore di ritorno con un recordset:

- Procedura memorizzata--

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

--Risultati--

inserisci qui la descrizione dell'immagine


Come ottengo questi risultati in php?
HagaHood

3

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 in questo modo:

EXEC GetMyInt OUTPUT @SelectedValue

2

Prova a farlo:

EXEC @SelectedValue = GetMyInt

7
Questo non è corretto. Un'istruzione SELECT non diventa il valore restituito da SPROC a meno che non sia specificato all'interno di SPROC.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.