web-dev-qa-db-fra.com

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

En T-SQL, cela est autorisé:

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

Il est donc possible d’obtenir la valeur d’un SELECT et de l’enfiler dans une variable (à condition qu’elle 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 le résultat de cette procédure stockée et le fourrer 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!)

92
David

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 motif: 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 de retour
puisque votre requête renvoie un champ int, du 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 suit:

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 null sont converties en zéro.

PARAMETRE 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 suit:

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 n'importe quel type de données.

RESULT SET pour un jeu de résultats, la procédure est la suivante:

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 ensembles de résultats peuvent avoir plusieurs lignes et plusieurs colonnes de tout type de données

186
KM.

Il y a aussi 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

--Appelant Code--

DECLARE @SelectedValue int
EXEC @SelectedValue = [TestProc] 

SELECT @SelectedValue

--Résultats--

enter image description here

4
markpcasey

Vous devrez 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
user151323

Essayez de faire ceci:

EXEC @SelectedValue = GetMyInt
2
Code Wolfe