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
相关产品推荐
相关产品推荐

