SQL Serverでストアドプロシージャを実行し、出力を変数に割り当てたい(単一の値を返す)?
4 に答える
それはあなたが返したい情報の性質に依存します。
単一の整数値の場合は、次の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
カーソルを返すこともできますが、それは恐ろしいので、例を挙げません:)
ストアドプロシージャ内のステートメントを使用してreturn
、整数のステータスコード(および整数型のみ)を返すことができます。慣例により、成功にはゼロの戻り値が使用されます。
noreturn
が明示的に設定されている場合、ストアドプロシージャはゼロを返します。
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
。
このコードを使用して、正しく機能する
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;
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)