sql-server-2012 - SQL 服务器 2012 : Check Constraint with Default Values

标签 sql-server-2012 check-constraints

我有以下专栏

EffectiveDate       Date NOT NULL  default getDate(),    
  CONSTRAINT chk_EffectiveDate CHECK (EffectiveDate >= getDate() AND  EffectiveDate <= TerminationDate ) ,

TerminationDate Date NOT NULL default '12/31/9999',
  CONSTRAINT chk_TerminationDate CHECK (TerminationDate > getDate() AND TerminationDate >= EffectiveDate),

我遇到的问题是,如果我不在那些列中输入值,则会抛出检查约束错误,它不接受默认值

我正在努力实现的目标是可能的吗?

最佳答案

这里真正的问题是您要将日期时间插入日期列,然后检查日期列 >= datetime。因此,如果您现在插入一行,则您正在检查:

2014-02-01 >= 2014-02-01 18:57

除非在极少数情况下您可能恰好在午夜插入一行,否则这永远不会成立。我想你想要的是:

EffectiveDate DATE NOT NULL DEFAULT GETDATE(),    
  CONSTRAINT chk_EffectiveDate CHECK 
    (EffectiveDate >= CONVERT(DATE, GETDATE()) 
     AND EffectiveDate <= TerminationDate),
TerminationDate DATE NOT NULL DEFAULT '99991231',
  CONSTRAINT chk_TerminationDate CHECK
    (TerminationDate > CONVERT(DATE, GETDATE()) 
     AND TerminationDate >= EffectiveDate),

这里仍然存在一些冲突,因为约束的一部分暗示生效日期和终止日期可能是同一天,但约束的另一部分阻止了它。正如 Andriy 在他的评论中所说,这可以简化为单个约束。假设您不想让生效日期和终止日期实际落在同一天,这可以通过一个双列约束来实现:

EffectiveDate DATE NOT NULL DEFAULT GETDATE(),    
TerminationDate DATE NOT NULL DEFAULT '99991231',
  CONSTRAINT chk_Dates CHECK 
    (EffectiveDate >= CONVERT(DATE, GETDATE()) 
     AND TerminationDate > EffectiveDate)

尽管正如我在上面的评论中提到的那样,我认为像 12/31/9999 这样的标记值是愚蠢的,不是 NULL 的合适替代品。你还应该 be very careful about using regional, ambiguous formats like mm/dd/yyyy .

关于sql-server-2012 - SQL 服务器 2012 : Check Constraint with Default Values,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21503189/

相关文章:

sql-server - SSIS 2012 找不到方法 : void

mysql - MySQL 是否支持检查约束?

sql-server - SQL Server : How to make server check all its check constraints?

sql - Oracle - 检查多列的约束

SQL Server 数据透视查询替代或优化

sql-server - SQL Server 长时间运行的查询需要数小时但使用低 CPU

version-control - 使用 Visual Studio Online (VSO) 进行 SQL Server 源代码管理

stored-procedures - 访问存储过程输出参数时出现间歇性空引用错误

sql-server - 何时评估检查约束?

SQL:检查约束/序列时出现问题