你有一个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
是AVG是一个变量,或者您正在寻找值的平均值? –
没有AVG是可变的,我存储几个值..然后基于平均值我需要找到等级 –
只是使用平均[]如[AVG] –