2010-02-07 69 views
1

使用SQL Server 2005插入值

当我插入日期时,应该比较表中的日期。

如果它是与其他日期相等时,它应该显示一个错误消息,并且也应该只允许插入一个日期。

对于实施例

表1

Date 

20091201 
20091202 

Insert into table1 values('20091202') 

上述查询不应允许插入相同的值

Insert into table1 values('20091204') 

上述查询也不应该允许插入长间隙日期。

查询应该只允许下一个日期。 它不应该允许相同的日期和较长的差距日期。

如何在此条件下插入查询。

有可能在SQL或VB.Net

需要SQL查询或VB.Net代码帮助

+4

不清楚你想要什么,你想要验证输入,或者你想要一个“自动增量”日期作为一个表上的列? – Hogan 2010-02-07 14:03:44

+0

是的我想验证输入,如果它等于或大于那么(意味着它应该只允许下一个日期)。它不应该是所有的长期差距日期。 – Gopal 2010-02-08 05:31:53

回答

1

你可以使用一个where条款,以确保前一天出现在表中,而目前天是不是:

insert into table1 ([dateColumn]) 
select '20091204' 
where exists (
    select * from table1 where [dateColumn] = dateadd(d,-1,'20091204') 
) 
and not exists (
    select * from table1 where [dateColumn] = '20091204' 
) 

if @@rowcount <> 1 
    raiserror ('Oops', 16, 1) 

如果插入成功,@@rowcount将会否则设置为1,则返回一个错误使用raiserror到VB。

+0

这是如何防止当前日期被插入两次?我想你假设桌子上已经有了一个唯一的约束条件(尽管这个问题似乎意味着没有)。 – 2010-02-07 15:31:24

+0

@Aaron Bertrand:对,我会为此添加一个额外的检查,一个唯一的约束也可以工作 – Andomar 2010-02-07 15:51:46

+0

唯一的约束更好,因为确保插入此表的每个人都使用此特定查询来执行此操作非常困难。 – 2010-02-07 19:19:24

0

听起来像你的日期字段应该只是uniqueauto-increment

+2

'自动增量'的SQL Server等价物是'identity',据我所知,它只支持离散数字类型 – Andomar 2010-02-07 14:08:04

+0

@Andomar:自动递增日期字段确实很愚蠢。日期有什么意义? – Aaronaught 2010-02-07 15:41:36

1

为什么不直接在预先设定的日期表,一旦你想“插”在该日期更新行?

我不知道我的理解中插入一个新的日期只有一次,也绝不允许有间隙的点。你能否更详细地描述你的业务问题?

当然,你可以使用一个IDENTITY列,然后有一个计算列或从计算天数的时间(有些日期)视图。但IDENTITY列不保证连续性,也不保证自己的唯一性(除非单独设置约束条件)。

防止重复应该具有唯一约束表级别来完成,而不是与查询。您可以首先检查重复项,以便以自己的方式处理错误(而不是让引擎为您举例),但这不应该是您唯一的检查。