如何在后台代码访问存储过程返回值?新手存储过程报错排查
问题分析与解决方案
嘿,我来帮你定位这个问题的根源~
你遇到的“确保该列存在于表中”错误,核心原因是存储过程返回的结果集没有给SUM计算的列指定别名。
看你的存储过程代码:
CREATE PROCEDURE [dbo].[spTotalOverTime] @tsdate DATE = '2018/1/1' AS BEGIN SELECT SUM(Overtime), SUM(PlanOt) FROM tblTimesheet WHERE YEAR(tsDate) = YEAR(@tsDate) AND MONTH(tsDate) = MONTH(@tsdate) END
这段代码执行后,返回的结果集列名不是你以为的Overtime和PlanOt,而是SQL Server自动生成的默认名称(比如Expr1000、Expr1001)。当你的C#代码尝试用原列名去读取结果时,自然会找不到对应的列,触发报错。
解决步骤
修改存储过程,给SUM结果添加明确的列别名
调整后的存储过程代码如下:CREATE PROCEDURE [dbo].[spTotalOverTime] @tsdate DATE = '2018/1/1' AS BEGIN SELECT SUM(Overtime) AS TotalOvertime, SUM(PlanOt) AS TotalPlanOt FROM tblTimesheet WHERE YEAR(tsDate) = YEAR(@tsDate) AND MONTH(tsDate) = MONTH(@tsdate) END这里用
AS关键字给两个总和列分别命名为TotalOvertime和TotalPlanOt,这样返回的结果集就有清晰可识别的列名了。在C#代码中使用别名读取数据
之后你的C#代码就可以通过TotalOvertime和TotalPlanOt这两个别名来获取对应的值,再把它们插入到HTML的不同标签里即可。
额外优化建议
另外,你当前用YEAR(tsDate) = YEAR(@tsDate)和MONTH(tsDate) = MONTH(@tsdate)的过滤方式,会导致SQL Server无法使用tsDate列上的索引(属于非SARGable查询),如果表数据量较大,查询性能会受影响。推荐改成以下方式来过滤当月数据:
WHERE tsDate >= DATEADD(month, DATEDIFF(month, 0, @tsDate), 0) AND tsDate < DATEADD(month, DATEDIFF(month, 0, @tsDate) + 1, 0)
这种写法可以让SQL Server利用索引进行高效查询,提升性能。
内容的提问来源于stack exchange,提问作者Alexis Villar
相关产品推荐
相关产品推荐

