【问题标题】:Inserting the values with condition插入带条件的值
【发布时间】:2026-01-18 13:10:02
【问题描述】:

使用 SQL Server 2005

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

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

举例

表1

Date 

20091201
20091202

Insert into table1 values('20091202')

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

Insert into table1 values('20091204')

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

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

如何使用此条件插入查询。

在 SQL 或 VB.Net 中是可能的

需要 SQL Query 或 VB.Net 代码帮助

【问题讨论】:

  • 不清楚您想要什么,您是在尝试验证输入还是想要“自动递增”日期作为表格中的一列?
  • 是的,我想验证输入,如果它等于或大于然后(意味着它应该只允许下一个日期)。它不应该都是长间隔日期。

标签: sql-server vb.net


【解决方案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返回错误。

【讨论】:

  • 如何防止当前日期被插入两次?我猜你假设表上已经有一个唯一的约束(尽管这个问题似乎暗示没有)。
  • @Aaron Bertrand:好的,我会为此添加一个额外的检查,唯一的约束也可以工作
  • 唯一约束更好,因为很难确保每个插入此表的人都使用此特定查询。
【解决方案2】:

为什么不提前设置一个日期表,并在您想要“插入”该日期时更新一行?

我不确定我是否理解只插入一次新日期的意义,并且绝不允许出现间隙。您能否更详细地描述一下您的业务问题?

当然,您可以使用 IDENTITY 列,然后使用计算列或视图来根据自(某个日期)以来的天数计算日期。但是 IDENTITY 列不保证连续性,它们甚至不保证自身的唯一性(除非您单独设置 suc 约束)。

应该在表级别使用唯一约束而不是查询来防止重复。您可以先检查重复项,以便以自己的方式处理错误(而不是让引擎为您引发异常),但这不应该是您唯一的检查。

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • auto-increment 的 SQL Server 等价物是 identity,据我所知,它只支持离散数字类型
    • @Andomar:自动递增的日期字段确实很愚蠢。这些日期有什么意义?