You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL Server存储过程返回值赋值变量始终为0的解决方法咨询

解决SQL Server存储过程结果赋值到变量始终为0的问题

你遇到的问题核心是:EXEC @变量 = 存储过程名这种写法获取的是存储过程的返回状态码(默认执行成功返回0),而不是存储过程中SELECT输出的查询结果。所以你的变量才会一直是0,下面给你两种可行的解决思路:

方法一:修改存储过程,添加OUTPUT参数(推荐)

这是最规范的方式,直接在存储过程里定义一个输出参数来传递结果:

首先更新你的存储过程代码:

CREATE OR ALTER PROCEDURE GetLatestUsageFactor801UNR
    @OutputFactor decimal(18,10) OUTPUT -- 定义输出参数
AS
BEGIN
    SET NOCOUNT ON; -- 避免返回额外的行数影响结果

    -- 将查询结果直接赋值给输出参数
    SELECT TOP 1 @OutputFactor = TotalUsageFactor
    FROM MarketMessage as a 
    INNER JOIN messagetype591 as b ON a.MarketMessageID = b.MarketMessageID 
    INNER JOIN AdditionalAggregationInformation as c ON b.MessageType591ID = c.MessageType591ID 
    INNER JOIN AdditionalAggregationData as d ON c.AdditionalAggregationInformationID = d.AdditionalAggregationInformationID 
    WHERE SettlementRunIndicator = 20 
      AND LoadProfileCode = 801 
      AND TimeOfUse = 'UNR' 
    ORDER BY SettlementDate DESC;
END

然后调用时要指定OUTPUT关键字来接收参数:

DECLARE @UsageFactor801UNR decimal(18,10);
EXEC GetLatestUsageFactor801UNR @OutputFactor = @UsageFactor801UNR OUTPUT; -- 注意OUTPUT关键字
SELECT @UsageFactor801UNR;

方法二:不修改存储过程,通过表变量接收结果集

如果不想改动原存储过程,可以用表变量先接住存储过程返回的结果,再从中取值:

DECLARE @UsageFactor801UNR decimal(18,10);
-- 创建临时表变量来存储存储过程的输出
DECLARE @TempResults TABLE (Factor decimal(18,10));

-- 将存储过程的结果插入到表变量
INSERT INTO @TempResults
EXEC GetLatestUsageFactor801UNR;

-- 从表变量中赋值给目标变量
SELECT @UsageFactor801UNR = Factor FROM @TempResults;

SELECT @UsageFactor801UNR;

补充说明

  • 存储过程的返回状态码:EXEC @var = ProcName中的@var只会拿到存储过程的执行状态(成功默认0,自定义错误可以用RETURN 错误码返回),和查询输出的结果完全是两回事。
  • 如果你的存储过程只会返回单行单列的结果,方法二的表变量方式非常好用;如果需要多次复用这个存储过程的结果,方法一的OUTPUT参数更高效清晰。

内容的提问来源于stack exchange,提问作者Seán-Pól

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 07:25:09