sophia0405

当你跌到谷底时,那正表示,你只能往上,不能往下!

 

sql中的while 循环语句

今天看了书中说的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啦!!

现在有了这个约束:程序便成了死循环

晕死!!

那该怎么解决这个问题呢?

posted on 2007-09-23 22:27  土猫敢死队  阅读(15993)  评论(3编辑  收藏  举报

导航