T-SQL get Valeur choisie de la procédure stockée

Dans T-SQL, ceci 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 la mettre 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 placer 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!)

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

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

Si plusieurs lignes sont renvoyées par la requête, votre @Variable contiendra uniquement 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 manière 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 maintenant appelez 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 que renvoyer une seule valeur int et les valeurs nulles 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 maintenant appelez votre procédure comme:

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

Les parameters de sortie ne peuvent renvoyer qu’une valeur, mais peuvent être n’importe quel type de données

RESULT SET pour un jeu de résultats, définissez la procédure comme suit:

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

l’utiliser 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

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 

–Calling Code–

 DECLARE @SelectedValue int EXEC @SelectedValue = [TestProc] SELECT @SelectedValue 

–Résultats–

entrer la description de l'image ici

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 

Essayez ceci:

 EXEC @SelectedValue = GetMyInt