一般来说。你用if exists(select 2 from Xuanke where Sno=@Sno)(一般用一个常数 表示是否存在记录。不用写列。可以提高下效率。) 就可以判断。 但是这个要看你XUANKE 这个表的结构。如果学生08没有选课。在XUANKE 表里面是不存在SNO=08的记录。还是有记录。 但是CNO 是空值。我上面的代码是实现第一种情况。一般选课表也都是这么做的。 如果是第二种情况。加个条件。 if exists(select 2 from Xuanke where Sno=@Sno and cno is not null)
你好,我用了第二种方法,但是结果还是一样,我把代码和记录贴上来create table Xuanke ( Sno int , Cno int, Score decimal, primary key (Sno,Cno), foreign key(Sno) references Students(Sno), foreign key(Cno) references Course(Cno) ) go create trigger screentime on Xuanke for insert as begin declare @Sno int declare @Cno1 int declare @Cno2 int declare @num int select @Sno=Sno from inserted select @Cno1=Cno from inserted print 1 if exists(select * from Xuanke where Sno=@Sno and Cno is not null) begin print 2 rollback tran end end go 这是执行的结果 1 2 消息 3609,级别 16,状态 1,第 1 行 事务在触发器中结束。批处理已中止。
select @Sno=Sno from inserted select @Cno1=Cno from inserted 你用这个有点问题。如果每次插入一行记录没问题,如果插入多行记录没法匹配啊。用SELECT 赋值虽然不报错。 但是只有最后一行有效。 比如表A 学号 2008 2009 2010 这样记录。一般只有最后一行对赋值有效。换一下 if exists (select * from inserted as a join xuanke as b on a.sno=b.sno and b.cno is not null ) (这个表示就有课了,当然这个只能判断有学生有课了。不能说明所有学生友课。。需要在判断上课时间是否冲突)
alter trigger screentime on Xuanke instead of insert as begin begin tran if exists(select * from Xuanke as a join inserted as b on a.Sno=b.Sno and a.Cno is not null) begin print '改学生已有课' rollback tran end else begin insert into xuanke select * from inserted print'插入成功' commit end end go insert into Xuanke values(101,01,80) insert into Xuanke values(101,02,80) --这2句进行分别执行。第一句没问题。但是执行第二句就会提示已经有课。会插入不成功这里必须用BEFORE 触发器。用FOR 触发器。表示触发器会在插入之后执行。你已经把记录插入到表里面了。 这样你在用IF 判断。表里面肯定存在记录啊。所有都是返回1
就可以判断。
但是这个要看你XUANKE 这个表的结构。如果学生08没有选课。在XUANKE 表里面是不存在SNO=08的记录。还是有记录。
但是CNO 是空值。我上面的代码是实现第一种情况。一般选课表也都是这么做的。
如果是第二种情况。加个条件。
if exists(select 2 from Xuanke where Sno=@Sno and cno is not null)
你好,我用了第二种方法,但是结果还是一样,我把代码和记录贴上来create table Xuanke
(
Sno int ,
Cno int,
Score decimal,
primary key (Sno,Cno),
foreign key(Sno) references Students(Sno),
foreign key(Cno) references Course(Cno)
)
go
create trigger screentime
on Xuanke
for insert
as begin
declare @Sno int
declare @Cno1 int
declare @Cno2 int
declare @num int
select @Sno=Sno from inserted
select @Cno1=Cno from inserted
print 1
if exists(select * from Xuanke where Sno=@Sno and Cno is not null)
begin
print 2
rollback tran
end
end
go 这是执行的结果
1
2
消息 3609,级别 16,状态 1,第 1 行
事务在触发器中结束。批处理已中止。
select @Cno1=Cno from inserted
你用这个有点问题。如果每次插入一行记录没问题,如果插入多行记录没法匹配啊。用SELECT 赋值虽然不报错。
但是只有最后一行有效。
比如表A
学号
2008
2009
2010
这样记录。一般只有最后一行对赋值有效。换一下
if exists (select * from inserted as a join xuanke as b
on a.sno=b.sno and b.cno is not null )
(这个表示就有课了,当然这个只能判断有学生有课了。不能说明所有学生友课。。需要在判断上课时间是否冲突)
alter trigger screentime
on Xuanke
instead of insert
as
begin
begin tran if exists(select * from Xuanke as a join inserted as b on a.Sno=b.Sno and a.Cno is not null)
begin
print '改学生已有课'
rollback tran
end
else
begin
insert into xuanke select * from inserted
print'插入成功'
commit
end
end
go insert into Xuanke values(101,01,80)
insert into Xuanke values(101,02,80)
--这2句进行分别执行。第一句没问题。但是执行第二句就会提示已经有课。会插入不成功这里必须用BEFORE 触发器。用FOR 触发器。表示触发器会在插入之后执行。你已经把记录插入到表里面了。
这样你在用IF 判断。表里面肯定存在记录啊。所有都是返回1