如何将存储过程的输出返回到sql server中的变量

Adh*_*ham 57 sql sql-server variables stored-procedures

我想在SQL Server中执行存储过程并将输出分配给变量(它返回单个值)?

pod*_*ska 117

这取决于您想要返回的信息的性质.

如果它是单个整数值,则可以使用该return语句

 create proc myproc
 as 
 begin
     return 1
 end
 go
 declare @i int
 exec @i = myproc
Run Code Online (Sandbox Code Playgroud)

如果您有非整数值或多个标量值,则可以使用输出参数

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
Run Code Online (Sandbox Code Playgroud)

如果要返回数据集,可以使用 insert exec

create proc myproc
as 
begin
     select name from sysobjects
end
go

declare @t table (name varchar(100))
insert @t (name)
exec myproc
Run Code Online (Sandbox Code Playgroud)

你甚至可以返回一个光标但是这很可怕所以我不会给出一个例子:)

  • 对于整数,您仍应使用输出参数.保留其设计的返回值:状态.优秀的程序员将概念分开并编写可靠的代码.如果返回整数的存储过程失败,会发生什么? (11认同)
  • @DRAM`return`返回单个**整数**值 (2认同)

Jos*_*tos 10

您可以使用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
Run Code Online (Sandbox Code Playgroud)

你这么称呼它:

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
Run Code Online (Sandbox Code Playgroud)

您应该仅使用状态代码的返回值.要返回数据,您应该使用输出参数.

如果要返回数据集,请使用类型的输出参数cursor.

更多关于RETURN声明

  • @downvoter,你介意解释什么是错的吗? (5认同)

小智 5

使用此代码,正常工作

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
Run Code Online (Sandbox Code Playgroud)

执行 SP

DECLARE @statuss bit;
EXECUTE  [dbo].[sp_delete_item] 6, @statuss output;
PRINT @statuss;
Run Code Online (Sandbox Code Playgroud)