T-SQL obtient la valeur SELECTed de la procédure stockée


95

Dans T-SQL, cela est autorisé:

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

Donc, il est possible d'obtenir la valeur d'un SELECT et de le remplir dans une variable (à condition que ce soit scalaire, évidemment).

Si je mets la même logique de sélection dans une procédure stockée:

CREATE PROCEDURE GetMyInt
AS
SELECT MyIntField FROM MyTable WHERE MyPrimaryKeyField = 1

Puis-je obtenir la sortie de cette procédure stockée et la remplir dans une variable?

Quelque chose comme:

DECLARE @SelectedValue int
SELECT @SelectedValue = EXEC GetMyInt

(Je sais que la syntaxe ci-dessus n'est pas autorisée car je l'ai essayée!)

Réponses:


191

vous pouvez utiliser trois méthodes: la valeur RETURN, le paramètre OUTPUT et un jeu de résultats

AUSSI, faites attention si vous utilisez le modèle: SELECT @Variable=column FROM table ...

s'il y a plusieurs lignes renvoyées par la requête, votre @Variable ne contiendra que la valeur de la dernière ligne renvoyée par la requête.

VALEUR RENVOYÉE
puisque votre requête renvoie un champ int, au moins en fonction de la façon dont vous l'avez nommé. vous pouvez utiliser cette astuce:

CREATE PROCEDURE GetMyInt
( @Param int)
AS
DECLARE @ReturnValue int

SELECT @ReturnValue=MyIntField FROM MyTable WHERE MyPrimaryKeyField = @Param
RETURN @ReturnValue
GO

et appelez maintenant votre procédure comme:

DECLARE @SelectedValue int
       ,@Param         int
SET @Param=1
EXEC @SelectedValue = GetMyInt @Param
PRINT @SelectedValue

cela ne fonctionnera que pour les INT, car RETURN ne peut renvoyer qu'une seule valeur int et les valeurs nulles sont converties en zéro.

PARAMÈTRE DE SORTIE
vous pouvez utiliser un paramètre de sortie:

CREATE PROCEDURE GetMyInt
( @Param     int
 ,@OutValue  int OUTPUT)
AS
SELECT @OutValue=MyIntField FROM MyTable WHERE MyPrimaryKeyField = @Param
RETURN 0
GO

et appelez maintenant votre procédure comme:

DECLARE @SelectedValue int
       ,@Param         int
SET @Param=1
EXEC GetMyInt @Param, @SelectedValue OUTPUT
PRINT @SelectedValue 

Les paramètres de sortie ne peuvent renvoyer qu'une seule valeur, mais peuvent être de n'importe quel type de données

RESULT SET pour un jeu de résultats, procédez comme suit:

CREATE PROCEDURE GetMyInt
( @Param     int)
AS
SELECT MyIntField FROM MyTable WHERE MyPrimaryKeyField = @Param
RETURN 0
GO

utilisez-le comme:

DECLARE @ResultSet table (SelectedValue int)
DECLARE @Param int
SET @Param=1
INSERT INTO @ResultSet (SelectedValue)
    EXEC GetMyInt @Param
SELECT * FROM @ResultSet 

les jeux de résultats peuvent avoir plusieurs lignes et plusieurs colonnes de n'importe quel type de données


5
Notez que l'approche du jeu de résultats nécessite cette utilisation de table / insert, même si un seul enregistrement est renvoyé. Je cherchais un raccourci directement dans une variable, mais il n'y en a pas.
goodeye le

est-il possible d'utiliser l'approche «valeur de retour» et «paramètre de sortie» dans le résultat de plusieurs lignes?
ji-ruh

@ ji-ruh, une procédure stockée peut utiliser un, aucun, certains ou tous: jeu de résultats, paramètres de sortie de retour et / ou valeur de retour
KM.

4

Il existe également une combinaison, vous pouvez utiliser une valeur de retour avec un jeu d'enregistrements:

--Procédure stockée--

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

--Code d'appel--

DECLARE @SelectedValue int
EXEC @SelectedValue = [TestProc] 

SELECT @SelectedValue

--Résultats--

entrez la description de l'image ici


Comment obtenir ces résultats en PHP?
HagaHood

3

Vous devez utiliser des valeurs de retour.

DECLARE @SelectedValue int

CREATE PROCEDURE GetMyInt (@MyIntField int OUTPUT)
AS
SELECT @MyIntField = MyIntField FROM MyTable WHERE MyPrimaryKeyField = 1

Ensuite, vous l'appelez comme ceci:

EXEC GetMyInt OUTPUT @SelectedValue

2

Essayez de faire ceci:

EXEC @SelectedValue = GetMyInt

7
Ceci est une erreur. Une instruction SELECT ne devient pas la valeur de retour du SPROC sauf si spécifié dans le SPROC.
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.