SQL服务器触发器无法正常工作

时间:2014-08-04 14:28:08

标签: sql sql-server

我创建了这个触发器,并选择:

SELECT @registro=seccion 
FROM dbo.horarios 
WHERE materia=@materia 
AND seccion=@seccionselect

无效。 This link表示:如果未从select返回值,则将保留先前的赋值。但是没有发现符合此条件的记录正在返回新数据。底部是输出和数据库值。

CREATE TRIGGER tgr_insertOnHorarios on horarios
 AFTER INSERT
 AS
   BEGIN
       DECLARE @materia varchar(7),@aula int,@profesor varchar(7), @seccion varchar(2),@dia varchar(10),
        @hora_desde time, @hora_hasta time, @cantidad int, @errores varchar(300), @displayError bit,@registro nchar(10)

   SELECT @materia= i.materia FROM inserted i;
   SELECT @profesor=i.profesor FROM inserted i;
   SELECT @seccion=i.seccion FROM inserted i;
   SELECT @dia= i.dia FROM inserted i;
   SELECT @hora_desde=i.hora_desde FROM inserted i;
   SELECT @hora_hasta= i.hora_hasta FROM inserted i;
   SELECT @cantidad= i.cantidad FROM inserted i;
   SELECT @aula = i.aula FROM inserted i;     
   IF  (SELECT cantidad_alumnos FROM aulas WHERE codigo=@aula)<@cantidad
   BEGIN 
            SET @errores= 'Contiene mas estudiantes de los permitidos en el aula,'
            PRINT @errores
            --RAISERROR (@errores,16,1);
            ROLLBACK TRANSACTION;
            RETURN 
    END

   print @seccion
   print @materia
   ***set @registro='empty'***
   print 'registro '+ @registro
   **SELECT @registro=seccion FROM dbo.horarios WHERE materia=@materia AND seccion=@seccion**   
   **print 'registro '+@registro**
   IF @registro = @seccion
   BEGIN                
            SET @errores= ' La seccion y la materia ya esta creada, por favor, haga una nueva seccion'
            PRINT @errores
            --RAISERROR (@errores,16,1);
            ROLLBACK TRANSACTION;
            RETURN 
    END       

       --------------------------------------------
      SELECT @registro=profesor FROM horarios WHERE dia=@dia AND hora_desde=@hora_desde AND @hora_hasta=hora_desde AND profesor=@profesor
       If @registro IS NOT NULL
       BEGIN                
            SET @errores=' el profesor ya esta asignado en este horario'
            PRINT @errores
            --RAISERROR (@errores,16,1);
            ROLLBACK TRANSACTION;
            RETURN 
       END
       --------------------------------------------
    declare @dayassig varchar(10),@desde time,@hasta time
   SELECT @registro=profesor, @dayassig=dia,@desde=hora_desde,@hasta=hora_hasta FROM horarios WHERE 
            @dayassig=@dia and
            ((@desde<=@hora_desde and @hasta>@hora_desde) OR
            (@desde<@hora_hasta and @hasta>=@hora_hasta))
       IF @registro IS NOT NULL        
       BEGIN
            SET @errores= @errores+' este horario choca'
            PRINT @errores
            --RAISERROR (@errores,16,1);
            ROLLBACK TRANSACTION;
            RETURN
       END   
END

[输出]

03 (printing input on insert seccion)
CCI-110 (printing input on insert materia)
registro **empty**  (before select)   
registro **03**     (after select, should not be returning this)
La seccion y la materia ya esta creada, por favor, haga una nueva seccion

[数据库值]

materia aula profesor   seccion  dia      hora_desde        hora_hasta   cantidad
CCI-110 501  7722       01  miercoles   12:00:00.0000000    15:00:00.0000000    25
CCI-110 501  7722       01  miercoles   12:00:00.0000000    16:00:00.0000000    25
CCI-110 501  7722       01  miercoles   14:00:00.0000000    16:00:00.0000000    25

如何看待不记录匹配input seccion 03materia CCI-110,而是[output is printing on register 03]

0 个答案:

没有答案