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.
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
Autrement
DECLARE @Count table(counting INT)
Insert into @Count
EXEC GetItemCount 123
SELECT Counting FROM @Count
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
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
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.
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