【问题标题】:How to set the result of exec stored procedure to a variable?如何将 exec 存储过程的结果设置为变量?
【发布时间】:2009-10-22 05:49:08
【问题描述】:

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

如何实现?

例如

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 

请帮忙。

【问题讨论】:

  • 您能至少向我们展示您存储过程的一部分吗?你在存储过程中做什么?
  • 我们需要查看存储的过程,或者至少是一些示例代码。

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


【解决方案1】:

代替:

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]

【讨论】:

  • 我认为重要的是要注意,如果您在存储过程中“选择”值而不是“返回”值,您会发现父过程实际上会根据您的“执行”返回一个值并且不会将其分配给变量。例如,如果 spGetNthNo 选择 200 而不是返回 200,@S 将是 0(默认)并且父/包装过程将返回 200(作为 EXEC 的结果)以及 0(作为从@S)。
【解决方案2】:

试试类似的方法

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

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

编辑:[在发布有问题的 T-SQL sn-p 后发表评论]
您似乎需要一个包装器,围绕 spGetNthNo 存储过程,可能是因为这个现有过程没有以所需的方式返回其结果。包装器的替代方案可能只是 [稍微] 修改 spGetNthNo 本身,因此它首先可以按需要工作(前提是该方法当前未与现有 API 一起使用)。

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多