[英]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.