插入值时检查sql中的数据

时间:2014-10-28 16:43:12

标签: c# sql asp.net sql-server

我想知道在插入之前如何检查表格中的数据。

例如:当我插入时,我想检查eventstart值是否在表中,StartDateRoom是否相同,如果是,则输出错误消息,否则插入值。

insert into events([Text], [eventStart], [EventEnd], [Repeat], [Days], [Room], [StartDate]) 
values(Text, EventStart, EventEnd, , Days, Room, StartDate)

2 个答案:

答案 0 :(得分:3)

我只是使用这样的查询。如果计数不为0,则至少有一个重复。

SELECT COUNT(*) 
FROM events
WHERE StartDate = @StartDate
  AND Room = @Room
  AND EventStart = @EventStart

我本来试图把它放在你的项目的上下文中(假设你正在使用SqlCommand等),但你没有在你的问题中包含任何代码。


如果您在尝试插入记录的同时询问如何检查重复项(而不是在之前,在单独的查询中),那么我不确定。如果有办法,我不会感到惊讶,我只是不知道。

答案 1 :(得分:3)

由于这里唯一相关的选项是“行不存在”和“行已存在”,因此不需要COUNT。 IF EXISTS效率更高,因为它会在找到一行时停止执行,而不是扫描整个表(或索引)只是为了找不到更多的条目,因为无论如何只有1个可以存在。

因此:

IF (EXISTS(
     SELECT *
     FROM   Events
     WHERE  [eventstart] = @EventStart
     AND    [StartDate] = @StartDate
     AND    [Room] = @Room
   ))
BEGIN
   RAISERROR('Row already exits!', 16, 1);
   RETURN;
END;
ELSE
BEGIN
   INSERT INTO Events
          ([Text], [eventStart], [EventEnd], [Repeat], [Days], [Room], [StartDate])
   VALUES (@Text, @EventStart, @EventEnd, @Repeat, @Days, @Room, @StartDate);
END;

以上内容可以在存储过程中完成,也可以通过C#(或其他语言)中的SqlCommand进行参数化查询。

根据您想要捕获条件的方式,可能通过UNIQUE CONSTRAINT来处理它,然后它会在插入时检查而不需要额外的代码(即IF EXISTS SELECT构造)。这里的优点是a)更少的代码和b)规则总是被强制执行,而不仅仅是在这一个实例中。缺点是a)“规则”有些隐藏,可能会被遗忘,直到某人愚蠢地编写不遵守规则的代码,并且b)中止INSERT的事务,如果可能的话我会尽量避免。最后,如果这是系统的严格规则,那么最好通过UNIQUE CONSTRAINT强制执行,这可以确保没有人可以绕过规则。

CREATE UNIQUE NONCLUSTERED INDEX [UIX_Events_fields]
   ON dbo.[Events] ([EventStart] ASC, [Room] ASC, [StartDate] ASC);

更好

两者都做。 UNIQUE INDEX(现在不是CONSTRAINT,这就是原因)不仅会强制执行规则,还会有助于加快IF EXISTS SELECT查询速度。这将允许您轻松管理“错误”条件和消息(而不是捕获SqlException并检查ErrorCode)。