web-dev-qa-db-fra.com

Comment retourner le résultat d'une procédure stockée dans une variable du serveur SQL

Je veux exécuter une procédure stockée dans SQL Server et affecter la sortie à une variable (elle renvoie une valeur unique)?

50
Adham

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

103
podiluska

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.

plus d'informations sur l'instruction RETURN

10
Jose Rui Santos

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;
3
Dinesh Vaitage

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)
0
Bindum