web-dev-qa-db-fra.com

Comment utiliser une valeur d'une procédure stockée dans une autre?

J'ai la déclaration suivante dans une procédure stockée:

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

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

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

Toutefois, lorsque je teste l'appel, l'EXEC sortira la valeur correctement, mais elle n'est pas attribuée correctement à la variable @Count. J'ai vu des exemples ou des procédures stockées utilisées comme celle-ci, y compris ici, mais aucune n'avait un paramètre et une valeur de retour utilisée (que je pouvais trouver). Le paramètre ID est transmis dans la deuxième instruction qui renvoie une valeur de comptage utilisée par la première photoprodicature - Toutes les informations que j'ai lues semblent indiquer que cela devrait fonctionner - mais ce n'est pas la valeur @Count is absent zéro, même lorsque le getItemCount retourne toujours la valeur correcte.

Ceci est dans Microsoft SQL Server 2008 si cela aide.

15
RoguePlanetoid

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

a) Affectation de la valeur du nombre à un paramètre de sortie:

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

appelé comme:

DECLARE @count INT
EXEC GetItemCount 123, @count OUTPUT

ou, b) attribuer 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
28
Matthew Abbott

Autrement

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

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.

Il est préférable d'utiliser le format suivant pour tous les cas (cela fonctionne sur toutes les versions):

DECLARE @MyOutputVariable int 
EXEC @MyOutputVariable  = [dbo].MyStoredProc 
2
MC9000

Vous devriez 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 id=@Id

end
Go

Declare @Count int
Declare @Id int

Set @Id = 1

Exec dbo.usp_Proc1 @Id, @Count output

select @Count
2
codingbadger

La solution (b) donnée par M. Matthew ne fonctionnera pas lorsque vous appellez cela dans une autre procédure stockée (solution de succès (A) fonctionne parfaitement lorsque nous utilisons la sortie param). L'alternance de la solution (B) est la solution de M.Madhivanan. I.E, créez une table Temp et utilisez-le puis laissez-le tomber.

Vous trouverez ci-dessous d'autres solutions ..

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

Veuillez vous reporter 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

Ce que vous attrapez dans la variable @Count est l'état de l'exécution de la procédure stockée GetItemCount et non de la valeur que vous vous attendez. Pour capturer cette valeur, vous avez deux manières.

  1. Pour déclarer un autre paramètre @Count comme sortie dans GetItemCount. Donc, vous aurez la déclaration GetitemCount comme suit

    Créer une procédure getItemCount @id int, @count int sortie

à l'intérieur, vous pouvez utiliser

Sélectionnez @Count = NEMT (article) de Tblitem où id = @ID

  1. Pour déclarer une table avant d'appeler la PROC et d'obtenir cette valeur sous forme de colonne.
0