Je veux exécuter une procédure stockée dans SQL Server et affecter la sortie à une variable (elle renvoie une valeur unique)?
Cela dépend de la nature des informations que vous souhaitez renvoyer.
S'il s'agit d'une valeur entière unique, vous pouvez utiliser l'instruction return
create proc myproc
as
begin
return 1
end
go
declare @i int
exec @i = myproc
Si vous avez une valeur non entière ou un nombre de valeurs scalaires, vous pouvez utiliser des paramètres de sortie.
create proc myproc
@a int output,
@b varchar(50) output
as
begin
select @a = 1, @b='hello'
end
go
declare @i int, @j varchar(50)
exec myproc @i output, @j output
Si vous souhaitez renvoyer un jeu de données, vous pouvez utiliser insert exec
.
create proc myproc
as
begin
select name from sysobjects
end
go
declare @t table (name varchar(100))
insert @t (name)
exec myproc
Vous pouvez même retourner un curseur mais c'est horrible, je ne donnerai donc pas d'exemple :)
Vous pouvez utiliser l'instruction return
à l'intérieur d'une procédure stockée pour renvoyer un code d'état entier (et uniquement de type entier). Par convention, une valeur de retour de zéro est utilisée pour le succès.
Si aucune variable return
n'est définie explicitement, la procédure stockée renvoie zéro.
CREATE PROCEDURE GetImmediateManager
@employeeID INT,
@managerID INT OUTPUT
AS
BEGIN
SELECT @managerID = ManagerID
FROM HumanResources.Employee
WHERE EmployeeID = @employeeID
if @@rowcount = 0 -- manager not found?
return 1;
END
Et vous appelez ça comme ça:
DECLARE @return_status int;
DECLARE @managerID int;
EXEC @return_status = GetImmediateManager 2, @managerID output;
if @return_status = 1
print N'Immediate manager not found!';
else
print N'ManagerID is ' + @managerID;
go
Vous devez utiliser la valeur de retour pour les codes d'état uniquement. Pour renvoyer des données, vous devez utiliser des paramètres de sortie.
Si vous souhaitez renvoyer un ensemble de données, utilisez un paramètre de sortie de type cursor
.
Utilisez ce code, fonctionne correctement
CREATE PROCEDURE [dbo].[sp_delete_item]
@ItemId int = 0
@status bit OUT
AS
Begin
DECLARE @cnt int;
DECLARE @status int =0;
SET NOCOUNT OFF
SELECT @cnt =COUNT(Id) from ItemTransaction where ItemId = @ItemId
if(@cnt = 1)
Begin
return @status;
End
else
Begin
SET @status =1;
return @status;
End
END
Exécuter SP
DECLARE @statuss bit;
EXECUTE [dbo].[sp_delete_item] 6, @statuss output;
PRINT @statuss;
Avec l'instruction Return du proc, j'avais besoin d'assigner la variable temp et de la transmettre à une autre procédure stockée. La valeur était affectée correctement mais en la passant en paramètre, elle a perdu la valeur. Je devais créer une table temporaire et définir la variable à partir de la table (SQL 2008)
From this:
declare @anID int
exec @anID = dbo.StoredProc_Fetch @ID, @anotherID, @finalID
exec dbo.ADifferentStoredProc @anID (no value here)
To this:
declare @t table(id int)
declare @anID int
insert into @t exec dbo.StoredProc_Fetch @ID, @anotherID, @finalID
set @anID= (select Top 1 * from @t)