8

je la déclaration suivante dans une procédure stockée:Comment utiliser une valeur d'une procédure stockée dans une autre?

DECLARE @Count INT 
EXEC @Count = GetItemCount 123 
SELECT @Count 

Ce qui appelle une autre procédure stockée avec la déclaration suivante à l'intérieur:

SELECT COUNT(Item) FROM tblItem WHERE ID = @ID 

Cependant, lorsque je teste l'appel EXEC sorties correctement la valeur mais n'est pas affecté correctement à la variable @Count. J'ai vu des exemples ou des procédures stockées utilisées comme ceci, y compris ici mais aucun d'entre eux n'avait un paramètre et une valeur de retour utilisée (que j'ai pu trouver). Le paramètre ID est passé dans la deuxième instruction qui renvoie une valeur de comptage utilisée par le premier StoredProcedure - toutes les informations que j'ai lues semblent indiquer que cela devrait fonctionner - mais la valeur de @Count n'est pas toujours nulle, même lorsque GetItemCount renvoie toujours la valeur correcte.

Ceci est dans Microsoft SQL Server 2008 si cela vous aide.

+0

J'ai pu obtenir ce travail - ayant une sortie en tant que paramètre a été la solution - garder oublier SQL n'est pas comme le style de programmation auquel je suis habitué. – RoguePlanetoid

Répondre

22

Dans votre procédure stockée, êtes-vous soit

a) Attribution de la valeur du comptage à un paramètre de sortie:

CREATE PROCEDURE GetItemCount 
    @id INT, 
    @count INT OUTPUT 
AS 
    SELECT @count = COUNT(Item) FROM tblItem WHERE ID = @id 

appelé:

DECLARE @count INT 
EXEC GetItemCount 123, @count OUTPUT 

ou, b) Affectation de la valeur de comptage comme valeur de retour:

CREATE PROCEDURE GetItemCount 
    @id INT 
AS 
BEGIN 
    DECLARE @count INT 
    SELECT @count = COUNT(Item) FROM tblItem WHERE ID = @id 

    RETURN @count 
END 

appelé comme:

DECLARE @count INT 
EXEC @count = GetItemCount 123 
+0

Merci pour cela - cela a fonctionné - ne pensait pas qu'une sortie serait un paramètre - c'est pourquoi je ne pouvais pas comprendre que je traitais la sortie d'affichage comme une sortie alors qu'en fait rien ne revenait - d'où il était zéro quand J'ai lu la valeur. – RoguePlanetoid

+0

J'ai cherché ce numéro plusieurs fois depuis que j'ai posé cette question et que je suis revenu ici et que j'ai trouvé la solution, j'aimerais pouvoir voter chaque fois que ça m'a aidé! – RoguePlanetoid

2

Vous devez passer @Count comme paramètre de sortie.

Create Proc dbo.usp_Proc1 

@Id int, 
@Count int output 

as begin 

select @Count = Count(Item) from tblItem where [email protected] 

end 
Go 

Declare @Count int 
Declare @Id int 

Set @Id = 1 

Exec dbo.usp_Proc1 @Id, @Count output 

select @Count 
+0

Cet exemple a également été utile pour que ma requête fonctionne correctement, merci encore. – RoguePlanetoid

0

Ce que vous attrapez dans la @Count variables est l'état d'exécution de la procédure stockée GetItemCount et non la valeur que vous attendez. Pour capturer cette valeur, vous avez deux façons.

  1. Pour déclarer un autre paramètre @count en tant que OUTPUT dans GetItemCount. Ainsi, vous aurez la déclaration GetItemCount comme suit

    CREATE PROCEDURE GetItemCount @ID int, int @count sortie

à l'intérieur, vous pouvez utiliser

SELECT @count = COUNT (point) DE tblItem OU ID = @ID

  1. Pour déclarer une table avant d'appeler proc et d'obtenir cette valeur en tant que colonne.
1

Une autre façon

DECLARE @Count table(counting INT) 
Insert into @Count 
EXEC GetItemCount 123 
SELECT Counting FROM @Count 
1

La solution (b) donnée par M. Matthew ne fonctionnera pas si u appellent cela dans une autre procédure stockée (solution Ofcourse (a) fonctionne parfaitement lorsque nous utilisons SORTIE param). L'alternance pour la solution (b) est la solution de M.Madhivanan. par exemple, créez une table temporaire et utilisez-la, puis déposez-la.

Voici d'autres solutions ..

Nous ne pouvons pas obtenir la valeur d'une clause interne de sortie dans une procédure stockée directement. Nous devons donc utiliser le paramètre OUTPUT ou RETURN VALUE à la place.

S'il vous plaît se référer aux suggestions suivantes:

SOLUTION 1:

CREATE PROCEDURE [dbo].[InsertProduct] 
     @pName varchar(50) 
AS 


BEGIN 
DECLARE @MyTableVar Table(ProductID 
int) 


     INSERT Products 
     ( 
      pName 
    ) 
     OUTPUT Inserted.ProductID 
INTO @MyTableVar 
     VALUES 
     ( 
     @pName 
    ) 
RETURN (SELECT ProductID 
FROM @MyTableVar) 
END 


DECLARE @ProductID int 
EXEC @ProductID = [dbo].insertproduc 'TEST' 
SELECT @ProductID 

SOLUTION: 2

CREATE PROCEDURE [dbo].[InsertProduct] 
     @pName varchar(50) , @pID int output 
AS 

BEGIN 
DECLARE @MyTableVar Table(ProductID int) 

     INSERT Products 
     (
      pName 
    ) 
     OUTPUT Inserted.ProductID INTO @MyTableVar 
     VALUES 
     (
     @pName 
    ) 
SELECT @pID=ProductID FROM @MyTableVar 
END 

DECLARE @ProductID int 
EXEC [dbo].insertproduc 'TEST', @ProductID OUTPUT 
SELECT @ProductID 
0

Ce qui suit ne fonctionnera pas s'il n'y a pas de paramètres d'entrée pour le SP exécuté:

EXEC [dbo].insertproduc 'TEST', @ProductID OUTPUT --works 
EXEC [dbo].insertproduc, @ProductID OUTPUT -- generates a parameter supplied when not needed error message if the insertproduc does not require parameters. 

utiliser au mieux le format suivant pour tous les cas (il fonctionne sur toutes les versions):

DECLARE @MyOutputVariable int 
EXEC @MyOutputVariable = [dbo].MyStoredProc 
Questions connexes