2017-08-18 27 views
-2
CREATE TRIGGER grade123 ON student 
AFTER INSERT 
AS 
BEGIN 
    UPDATE student 
    SET grade = CASE 
        WHEN avg > 75 THEN 'firstclass' 
        WHEN avg > 50 AND avg < 75 THEN 'second class' 
        WHEN avg > 35 AND avg < 60 THEN 'third class' 
        ELSE 'fail' 
       END 

发现学生的年级,我得到一个错误:当我创建一个触发基于其AVG(SQL Server)的

Msg 102, Level 15, State 1, Procedure grade123, Line 11
Incorrect syntax near 'END'

请帮我出

+0

是AVG是一个变量,或者您正在寻找值的平均值? –

+0

没有AVG是可变的,我存储几个值..然后基于平均值我需要找到等级 –

+0

只是使用平均[]如[AVG] –

回答

1

你有一个BEGIN对于你的触发器,你需要添加另一个END。 AVG这个词也是一个保留字,所以你需要转义它。

CREATE TRIGGER grade123 ON student 
AFTER INSERT 
AS 
BEGIN 
    UPDATE student SET grade = 
    CASE 
     WHEN [avg] > 75 THEN 'first class' 
     WHEN [avg] > 50 AND [avg] <= 75 THEN 'second class' 
     WHEN [avg] > 35 AND [avg] < 60 THEN 'third class' 
     ELSE 'fail' 
    END 
END 

然而,随着@marc_s说你的触发器目前正在更新的表的每一行EVERY任何时间行插入。所以,你应该查找添加到inserted这是提供给触发器一个特殊的表,显示哪些记录进行了修改

假设学生模样

CREATE TABLE students 
(
    student_id int identity(1,1), 
    grade varchar(10), 
    [avg] int 
) 
GO 

然后

CREATE TRIGGER grade123 ON students 
AFTER INSERT 
AS 
BEGIN 
    UPDATE students SET grade = 
    CASE 
     WHEN [avg] > 75 THEN 'first class' 
     WHEN [avg] > 50 AND [avg] <= 75 THEN 'second class' 
     WHEN [avg] > 35 AND [avg] < 60 THEN 'third class' 
     ELSE 'fail' 
    END 
    where student_id in (select student_id from inserted) 
END 

用于与循环IF..ELSE(虽然我永远不会在生产中使用它,而只是为了显示它看起来像什么)

SET NOCOUNT ON; 

declare @students table 
(
    ident int identity(1,1), 
    student_id int, 
    [avg] int 
) 

INSERT INTO @students (student_id, [avg]) 
select student_id, [avg] 
from students 

declare @table_count int = (select COALESCE(count(ident),0) from @students) 
declare @counter int = 1 

declare @avg int 

WHILE (@table_count > 0 AND @counter <= @table_count) 
BEGIN 
    select @avg = [avg] 
    from @students 
    where ident = @counter 

    IF (@avg > 75) 
     UPDATE students SET 
      grade = 'first class' 
     WHERE student_id = @counter 
    ELSE IF (@avg > 50 AND @avg <= 75) 
     UPDATE students SET 
      grade = 'second class' 
     WHERE student_id = @counter 
    ELSE IF (@avg > 35 AND @avg < 60) 
     UPDATE students SET 
      grade = 'third class' 
     WHERE student_id = @counter 
    ELSE 
     UPDATE students SET 
      grade = 'fail' 
     WHERE student_id = @counter 

    set @counter += 1; 
END 
+0

可以在IF ELSE LOOP中回答相同的代码 –

+0

对不起,我不确定你的意思 –

+0

你可以写相同的函数来使用循环条件(IF) –

相关问题