繁体   English   中英

检查记录是否存在多个条件,否则插入SQL Server存储过程

[英]Check if record exists with multiple conditions else insert in a SQL Server stored procedure

我已经编写了以下程序,以检查与老师或教室或(特定标准和部门)的日期和时段组合的记录,如下所示。

ALTER PROCEDURE [dbo].[procCreateSchedule]
    (@classId INT, 
     @dayId INT, 
     @slotId INT, 
     @standardId INT, 
     @divisionId INT, 
     @subjectId INT, 
     @teacherId INT)
AS
BEGIN
    IF NOT EXISTS (SELECT * FROM schedules_test
                   WHERE day = @dayId
                     AND slot = @slotId
                     AND standard = @standardId
                     AND division = @divisionId) 
    ELSE
       IF NOT EXISTS (SELECT * FROM schedules_test
                      WHERE day = @dayId
                        AND slot = @slotId
                        AND teacherId = @teacherId)
       ELSE
          IF NOT EXISTS (SELECT * FROM schedules_test
                         WHERE day = @dayId
                           AND slot = @slotId
                           AND classroom = @classId)
          ELSE
          BEGIN
              INSERT INTO schedules_test (classroom, day, slot, standard, division, subject, teacherId) 
              VALUES (@classId, @dayId, @slotId, @standardId, @divisionId, @subjectId, @teacherId)
          END
      END

但是似乎没有用。 请问有人可以建议在插入之前如何检查多个条件,或者是否有其他方法可以解决此问题?

您可以在一条SELECT语句中将所有条件转换为一个WHERE子句:

IF EXISTS (
    SELECT * FROM scheduled_tests
    WHERE day=@dayId AND slot=@slotId AND 
          (classroom=@classId  OR teacherId OR standard=@standardId AND division=@divisionId)
)

 ....

但是实际上,如果可以的话,不要编写存储过程。 将此逻辑添加到您的C#代码中,以后将来每个人阅读该代码都将更加容易维护。

不要在应用程序层进行检查。 您必须遵守竞争条件-两个不同的线程会插入相同的数据。 两者都能成功。

而是,创建唯一索引,以便数据库验证数据。 唯一索引应位于:

  • schedules_test(day, slot, standard, division)
  • schedules_test(day, slot, teacherid)
  • schedules_test(day, slot, classid)

(注意:键的顺序无关紧要。)

然后,存储过程的主体可以使用try / catch

begin try
    insert into schedules_test(classroom, day, slot, standard, division, subject, teacherId) 
        values (@classId, @dayId, @slotId, @standardId, @divisionId, @subjectId, @teacherId);
end try
begin catch
    . . .
end catch;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM