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!)
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
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--
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
Essayez de faire ceci:
EXEC @SelectedValue = GetMyInt