今天看了书中说的while 的示例程序,发现这个示例程序,存在不小的漏洞
examno stuno writtenexam labexam
----------- ---------- ----------- -------
e2005070001 s25301 94 87
e2005070002 s25303 86 46
e2005070004 s25305 62 54
e2005070006 s25307 82 88
e2005070008 s25308 57 57
以下是本书的讲解:
问题:本次考试成绩不理想,假定要提分,确保每人笔试都通过。提分规则很简单,先每人都加2分,看是否都通过,如果没有全部通过,继续加分,再看是否全部通过,如此反复,直到所有的人都通过为止。
分析:第一步:统计没有通过的人数(<60)
第二步:如果有人没通过,加分
第三步:循环判断
代码:
select * from stumarks
declare @n int
while(0=0)
begin
select @n=count(*) from stumarks where writtenexam<60
if @n>0
update stumarks set writtenexam=writtenexam+2
else
break
end
print ('加分后的成绩为')
select * from stumarks
按照它的这个讲解,一点问题也没有,可是,当把数据稍微改动一下的时候,问题就来了:
如下:
examno stuno writtenexam labexam
----------- ---------- ----------- -------
e2005070001 s25301 94 87
e2005070002 s25303 86 46
e2005070004 s25305 62 54
e2005070006 s25307 82 88
e2005070008 s25308 47 57
发现了吧?我把 57 改成 47
由于表,刚开始在设计的时候,考虑到分数的范围问题,便设置了检查约束:分数在0-100之间
可以想象:如果没有这个约束,程序肯定能运行,但结果呢:
examno stuno writtenexam labexam
----------- ---------- ----------- -------
e2005070001 s25301 108 87
e2005070002 s25303 100 46
e2005070004 s25305 76 54
e2005070006 s25307 96 88
e2005070008 s25308 61 57
哈哈,分数超100啦!!
现在有了这个约束:程序便成了死循环
晕死!!
那该怎么解决这个问题呢?
转载于:https://www.cnblogs.com/sophia0405/archive/2007/09/23/903575.html