if EXISTS(select Cno from Xuanke where Sno=@Sno)
--有
ELSE
--没有

解决方案 »

  1.   

    一般来说。你用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)
      

  2.   


    你好,我用了第二种方法,但是结果还是一样,我把代码和记录贴上来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 行
    事务在触发器中结束。批处理已中止。
      

  3.   

    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 )
    (这个表示就有课了,当然这个只能判断有学生有课了。不能说明所有学生友课。。需要在判断上课时间是否冲突)
      

  4.   


    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 
      

  5.   

    额,请问这个before触发器怎么办?sql server 2008 r2 好像没有这个