如何将exec存储过程的结果设置为变量?

时间:2009-10-22 05:49:08

标签: sql sql-server-2005 stored-procedures

我需要执行一个存储过程并将其标量结果存储到存储过程中的局部变量。

如何实施?

E.G。

CREATE PROCEDURE [dbo].GetNthNo AS 
 DECLARE @a INT
 DECLARE @d INT
 DECLARE @n INT
DECLARE @S INT
SET @S=EXEC spGetNthNo @a,@d,@n

SELECT @S 

请帮忙。

2 个答案:

答案 0 :(得分:2)

而不是:

SET @S=EXEC spGetNthNo @a,@d,@n

你需要:

EXEC @S = spGetNthNo @a,@d,@n

然后在程序中,您需要以下内容:

RETURN 100

或:

RETURN @x

表示执行该过程后您想要的@S值。

您还可以使用输出参数。合并示例:

IF OBJECT_ID('tempdb..#example') IS NOT NULL DROP PROCEDURE #example
GO

CREATE PROCEDURE #example
  @output_param INT OUTPUT
AS BEGIN
   SET @output_param = 100
   RETURN 200
END
GO

DECLARE @return INT, @param INT
EXEC @return = #example @output_param = @param OUTPUT
SELECT @return as [return value], @param as [output parameter]

答案 1 :(得分:1)

尝试类似的东西

CREATE PROCEDURE Test
  @RetVal INT OUT
AS
BEGIN
  SET @RetVal = 99
END

DECLARE @X INT
EXEC Test @X OUT
PRINT @X

修改:[发布有问题的T-SQL代码段后的评论]
您似乎需要围绕spGetNthNo存储过程的包装器,可能是因为此现有过程未按所需方式返回其结果。包装器的替代方法可能只是简单地修改spEetNthNo本身,因此它首先按照需要工作(假设该方法当前未与其现有API一起使用)。

无论更改是在原始SP还是在包装器中,有两种不同的方法可以从SP检索数据:

  • 使用输出变量(如上所示)
  • 通过让SP返回“记录集”,即由行(记录)和列(字段)组成的表。 (这是通过在SP的末尾添加SELECT语句来完成的,如问题代码段所示)

使用输出变量方法,在SP返回时,数据很容易放入变量中。使用记录集apporach,调用逻辑需要“消耗”返回的数据,其方式与SELECT语句类似。

除了返回数据的使用方式之外,这些方法之间存在一些差异
最明显的一点是“记录集”方法允许返回更多值:必须明确声明30个变量(一些命名约定旨在帮助表的二维性质) )模拟SP的返回“选择TOP 10 a,b,c FROM myTable”。 SP也必须明确设置每个输出变量 另一个相关但更微妙的区别是记录集方法允许返回在调用时未定义的多个行和列。变量的数量和类型不需要事先表达,而是带有记录集周围的元数据。

简而言之:输出变量方法更适合返回一些固定的变量集,例如状态代码,最大值或最小值(或其他聚合值和计算),或者,预期的单个记录中的几个字段。当存储过程的目的是有效地提供类似于表的结果,或者当它返回很多值时,例如一个长的[和不断发展的]聚合值列表等,就会使用Recordset方法。