【问题标题】:How to return the output of stored procedure into a variable in sql server如何将存储过程的输出返回到sql server中的变量中
【发布时间】:2012-08-11 12:14:40
【问题描述】:

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

【问题讨论】:

  • 你的存储过程返回什么?单一价值?结果集?

标签: sql sql-server variables stored-procedures


【解决方案1】:

您可以在存储过程中使用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 类型的输出参数。

more on RETURN statement

【讨论】:

    【解决方案2】:

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

    如果是单个整数值,可以使用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
    

    你甚至可以返回一个光标,但这太可怕了,所以我不会举个例子:)

    【讨论】:

    • 对于整数,您仍应使用输出参数。为它们的设计保留返回值:状态。优秀的程序员分离概念并编写可靠的代码。如果返回整数的存储过程发生故障会怎样?
    • 我确实观察到了一个异常情况,即当我返回小数时,它的小数位为零,但是当我将其更改为选择时,它会正确返回小数位。
    • @DRAM return 返回单个 整数
    • 最后一个返回示例非常有用,我能够返回一个数据集,并将字段数据分配给几个变量>>使用 [ select @variable= name from @t]
    • @Muflix,在这种情况下,请使用 INSERT/EXEC 示例。
    【解决方案3】:

    使用此代码,正常工作

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

      使用 proc 中的 Return 语句,我需要分配 temp 变量并将其传递给另一个存储过程。该值被正确分配,但是当将其作为参数传递时,它丢失了该值。我必须创建一个临时表并从表中设置变量(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)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-01-26
        • 2011-02-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多