93 votes

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!)

188voto

KM. Points 51800

il existe trois méthodes que vous pouvez utiliser: la valeur de RETOUR, et le paramètre de SORTIE et un jeu de résultats

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

si il y a plusieurs lignes renvoyées par la requête, votre @Variable ne contient que la valeur de la dernière ligne retournées par la requête.

VALEUR DE RETOUR
depuis votre requête retourne un int terrain, du moins basé sur la façon dont vous l'a 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 fonctionne que pour les Entiers, parce que le RETOUR ne peut retourner une seule valeur int et les valeurs null sont convertis à un 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 maintenant, appelez 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 peut retourner qu'une seule valeur, mais peut être n'importe quel type de données

JEU DE RÉSULTATS pour un ensemble de résultats de rendre la procédure comme:

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

utiliser comme:

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

des ensembles de résultats peut avoir le nombre de lignes et nombre de colonnes de type de données

4voto

markpcasey Points 234

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
 

- Code d'appel--

 DECLARE @SelectedValue int
EXEC @SelectedValue = [TestProc] 

SELECT @SelectedValue
 

--Résultats--

entrez la description de l'image ici

2voto

Code Wolfe Points 107

Essayez de faire ceci:

 EXEC @SelectedValue = GetMyInt
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X