SQL的存储过程

胖胖的球球呀 2017-11-22 09:33:15
写了一个将学生选课成绩从百分制改为等级制(即A、B、C、D、E)的存储过程。
CREATE TABLE Rank /*创建等级表
(学号 char(20),
等级 char(4))

CREATE PROCEDURE proStatisticMark
AS
BEGIN
DECLARE @less60 char(4),@b60a70 char(4),@b70a80 char(4),@b80a90 char(4),@more90 char(4),@grade int
SET @less60=0
SET @b60a70=0
SET @b70a80=0
SET @b80a90=0
SET @more90=0
DECLARE curCourse CURSOR
FOR SELECT grade
FROM sc /*sc是成绩表
OPEN curCourse
FETCH curCourse INTO @grade
SELECT @grade=count(grade)FROM sc /*读取成绩表的每个学生的成绩
WHILE (@@FETCH_STATUS=0)
BEGIN
if @grade<60
begin
SELECT @less60='E'
print @less60
end
if @grade>=60 AND @grade<70
begin
SELECT @b60a70='D'
print @b60a70
end
if @grade>=70 AND @grade<80
begin
SELECT @b70a80='C'
print @b70a80
end
if @grade>=80 AND @grade<90
begin
SELECT @b80a90='B'
print @b80a90
end
if @grade>=90
begin
SELECT @more90='C'
print @more90
end
END
insert into Rank values('201522121',@less60) /*将读取成绩表的每个学生的成绩放入等级表中
insert into Rank values('201522121',@b60a70)
insert into Rank values('201522121',@b70a80)
insert into Rank values('201522122',@b80a90)
insert into Rank values('201522122',@more90)
CLOSE curCourse
END
EXECUTE proStatisticMark
select *from Rank
但是运行的结果是Rank表除了列名,任何数值都没有
并且执行proStatisticMark过程时,电脑一直显示正在执行查询。
...全文
232 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
日月路明 2017-11-22
  • 打赏
  • 举报
回复
另外,写的代码有问题,其实可以一句话解决 insert into Rank select sNo,Degree=case when grade<60 then 'E' when Grade<70 then 'D' when Grade<80 then ’C' when Grade<90 then 'B' else 'A' end from sc
日月路明 2017-11-22
  • 打赏
  • 举报
回复
死循环!!!!
听雨停了 2017-11-22
  • 打赏
  • 举报
回复

CREATE PROCEDURE proStatisticMark
AS
BEGIN
	DECLARE @less     CHAR(4),	--等级
	        @grade      INT,
	        @sNo	VARCHAR(50)	--新增学号变量(成绩表中应该有这个字段的吧)	
	
	DECLARE curCourse CURSOR  
	FOR
		--按学号sum得到总成绩(鉴于你下面写的count的理解哈)
	    SELECT sno,sum(grade) AS sum_grade
	    FROM   sc --sc是成绩表
	    GROUP BY sno	              
	OPEN curCourse
	FETCH NEXT FROM curCourse INTO @sNo,@grades
	
	--DECLARE curCourse CURSOR  
	--FOR
		
	--    SELECT grade
	--    FROM   sc --sc是成绩表
	--OPEN curCourse
	--FETCH curCourse INTO @grades
	                                 	
	--这里为何要count呢,就算要聚合不是也应该用sum的吗	                                 	
	--SELECT @grade = COUNT(grade)	
	--FROM   sc --读取成绩表的每个学生的成绩
	--上面这个查询完全多余的啊
	         
	WHILE (@@FETCH_STATUS = 0)
	BEGIN
	    IF @grade < 60
	    BEGIN
	        SELECT @less = 'E'
	        PRINT @less
	    END	    
	    ELSE IF @grade >= 60
	       AND @grade < 70
	    BEGIN
	        SELECT @less = 'D'
	        PRINT @less
	    END	    
	    ELSE IF @grade >= 70
	       AND @grade < 80
	    BEGIN
	        SELECT @less = 'C'
	        PRINT @less
	    END	    
	    ELSE IF @grade >= 80
	       AND @grade < 90
	    BEGIN
	        SELECT @less = 'B'
	        PRINT @less
	    END	    
	    ELSE --@grade >= 90
	    BEGIN
	        SELECT @less = 'A'
	        PRINT @less
	    END
	    	    
		INSERT INTO RANK
		VALUES
		  (
			@sNo,
			@less
		  ) 
		  	
		FETCH NEXT FROM curCourse INTO @sNo,@grades
			    
	END
	CLOSE curCourse		--关闭游标
	DEALLOCATE curCourse	--释放游标
		
END 

EXECUTE proStatisticMark
SELECT *
FROM   RANK
看你的逻辑理解的大概改成这个意思,不知道理解的对不对,你看一下
二月十六 版主 2017-11-22
  • 打赏
  • 举报
回复
一直在查询是因为忘了加
 FETCH curCourse INTO @grade


WHILE ( @@FETCH_STATUS = 0 )
BEGIN
IF @grade < 60
BEGIN
SET @less60 = 'E'
PRINT @less60
END
IF @grade >= 60
AND @grade < 70
BEGIN
SET @b60a70 = 'D'
PRINT @b60a70
END
IF @grade >= 70
AND @grade < 80
BEGIN
SET @b70a80 = 'C'
PRINT @b70a80
END
IF @grade >= 80
AND @grade < 90
BEGIN
SET @b80a90 = 'B'
PRINT @b80a90
END
IF @grade >= 90
BEGIN
SET @more90 = 'C'
PRINT @more90
END
FETCH curCourse INTO @grade
END


还有楼主的这句不是很明白
FETCH curCourse INTO @grade
SELECT @grade=count(grade)FROM sc /*读取成绩表的每个学生的成绩
日月路明 2017-11-22
  • 打赏
  • 举报
回复
引用 7 楼 RINK_1 的回复:
你这游标有几个问题。 1.没有触发游标指针前移的Fetch Next。 2.插入表数据的操作,应该在游标主体内进行。 3.需要插入新表的学号数据,不应该写死,而应该作为变量从成绩表里取出来,然后作为参数传入游标内,最后再插入到新表中。 还有,你这个插入新表的操作为啥要用游标。用以下试试呢。

insert into Rank
select 学号,
       case when grade<60 then 'E'
       when grade>=60 and grade<70 then 'D'
       when grade>=70 and grade<80 then 'C'
       when grade>=80 and grade<90 then 'B'
       else 'A'
       end
from sc
grade>=60 grade>=70....不需要写
RINK_1 2017-11-22
  • 打赏
  • 举报
回复
你这游标有几个问题。 1.没有触发游标指针前移的Fetch Next。 2.插入表数据的操作,应该在游标主体内进行。 3.需要插入新表的学号数据,不应该写死,而应该作为变量从成绩表里取出来,然后作为参数传入游标内,最后再插入到新表中。 还有,你这个插入新表的操作为啥要用游标。用以下试试呢。

insert into Rank
select 学号,
       case when grade<60 then 'E'
       when grade>=60 and grade<70 then 'D'
       when grade>=70 and grade<80 then 'C'
       when grade>=80 and grade<90 then 'B'
       else 'A'
       end
from sc

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧