SQL Server存储过程创建失败:总分更新与平均分列添加问题
解决SQL Server存储过程报错问题
报错原因
你遇到的错误是因为在ALTER TABLE添加列的DEFAULT约束中,不能直接引用表中的其他列(比如Total)。SQL Server规定默认约束只能使用常量、常量表达式或变量,不允许引用同表的列名。
修正后的存储过程代码
create or alter procedure TotMarks as begin -- 更新Chennai学生的Total列 update sm set sm.Total = sm.Mark1 + sm.Mark2 + sm.Mark3 from StudentMarks sm join CityMaster cm on sm.CityID = cm.CityID where cm.CityName = 'Chennai' -- 新增AvgMark列(指定精度避免默认精度问题) alter table StudentMarks add AvgMark decimal(10,2) -- 计算所有学生的平均分 update StudentMarks set AvgMark = case when Total is not null then Total/3 else (Mark1 + Mark2 + Mark3)/3 -- 兼容Total为NULL的学生 end end
关键说明
- 新增
AvgMark列时,不能设置依赖Total的默认约束,因为默认约束无法动态引用其他列的实时值。 - 更新平均分的逻辑中,通过
CASE分支兼容两种情况:Chennai学生用已更新的Total计算,其他学生直接用原始分数计算,确保所有学生都能得到有效平均分。 - 给
decimal类型指定(10,2)的精度,避免SQL Server使用默认精度可能带来的数值截断或精度丢失问题。
内容的提问来源于stack exchange,提问作者Zoro
相关产品推荐
相关产品推荐

