web-dev-qa-db-ja.com

ストアドプロシージャの出力をSQLサーバーの変数に返す方法

SQL Serverでストアドプロシージャを実行し、出力を変数に割り当てます(単一の値を返します)?

54
Adham

それはあなたが返したい情報の性質に依存します。

単一の整数値の場合、returnステートメントを使用できます

 create proc myproc
 as 
 begin
     return 1
 end
 go
 declare @i int
 exec @i = myproc

非整数値または多数のスカラー値がある場合、出力パラメーターを使用できます

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

データセットを返す場合は、insert execを使用できます

create proc myproc
as 
begin
     select name from sysobjects
end
go

declare @t table (name varchar(100))
insert @t (name)
exec myproc

カーソルを返すこともできますが、それは単に恐ろしいので、例を挙げません:)

114
podiluska

ストアドプロシージャ内でreturnステートメントを使用して、整数ステータスコード(整数型のみ)を返すことができます。規則により、成功の場合はゼロの戻り値が使用されます。

returnが明示的に設定されていない場合、ストアドプロシージャはゼロを返します。

   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

そして、あなたはそれをこのように呼びます:

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

ステータスコードにのみ戻り値を使用する必要があります。データを返すには、出力パラメーターを使用する必要があります。

データセットを返す場合は、cursor型の出力パラメーターを使用します。

RETURNステートメントの詳細

10
Jose Rui Santos

このコードを使用し、適切に動作する

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

SPを実行

DECLARE @statuss bit;
EXECUTE  [dbo].[sp_delete_item] 6, @statuss output;
PRINT @statuss;
4
Dinesh Vaitage

ProcからのReturnステートメントを使用して、一時変数を割り当て、別のストアドプロシージャに渡す必要がありました。値は正常に割り当てられていましたが、パラメーターとして渡すと値を失いました。一時テーブルを作成し、テーブルから変数を設定する必要がありました(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