SQL Server声明OUTPUT参数的存储过程执行仍返回NULL如何解决
问题排查与解决方案
核心问题原因
@Kind参数定义未指定长度。SQL Server中NVARCHAR类型如果不主动声明长度,默认值为1,你传入的N'Rầy nâu'会被截断为仅保留第一个字符,和Insects表中Kind字段的完整值无法匹配,WHERE条件过滤后无符合条件的数据,SUM()计算无结果自然返回NULL。- 可选兼容问题:即使参数正常,若当天对应虫类没有诱捕记录,
SUM()本身也会返回NULL,不符合业务预期的话可以做兼容处理。 - 冗余代码:当前WHERE已经固定了
I.Kind = @Kind和CT.Date = @Date,GROUP BY的两个字段已经是固定值,最多只会返回一组结果,GROUP BY属于冗余可以删除。
修改后的存储过程代码
IF EXISTS (SELECT * FROM sysobjects WHERE id = object_id(N'[dbo].[GetTotalInsectsInTrap]') and OBJECTPROPERTY(id, N'IsProcedure') = 1) DROP PROCEDURE [dbo].[GetTotalInsectsInTrap] GO CREATE PROCEDURE [dbo].[GetTotalInsectsInTrap] @Date DATE, @Kind NVARCHAR(255), -- 按需调整长度,匹配Insects表Kind字段的实际长度即可 @TotalQuantity INT OUTPUT AS BEGIN SELECT @TotalQuantity = ISNULL(SUM(CTD.Quantity), 0) -- 无匹配时返回0而非NULL FROM CheckTrapDetails AS CTD JOIN CheckTraps AS CT ON CT.Id = CTD.CheckTrapId JOIN Insects AS I ON I.Id = CTD.InsectId WHERE CT.Date = @Date AND I.Kind = @Kind END
验证说明
修改存储过程后重新执行原来的调用代码,即可正常返回统计值。如果仍返回0,可直接执行对应查询语句确认是否存在对应日期对应虫类的诱捕记录:
SELECT SUM(CTD.Quantity) FROM CheckTrapDetails AS CTD JOIN CheckTraps AS CT ON CT.Id = CTD.CheckTrapId JOIN Insects AS I ON I.Id = CTD.InsectId WHERE CT.Date = '2021-05-04' AND I.Kind = N'Rầy nâu'
内容的提问来源于stack exchange,提问作者savethesavior
相关产品推荐
相关产品推荐

