SQL Server 2012:使用默认值检查约束

NSS*_*NSS 2 check-constraints sql-server-2012

我有以下专栏

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),
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是,如果我没有在那些列中输入值,它会抛出checkconstraint错误,它不接受默认值

我想要实现的是什么?

Aar*_*and 6

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

2014-02-01 >= 2014-02-01 18:57
Run Code Online (Sandbox Code Playgroud)

除非在极少数情况下您可以在午夜插入一行,否则这将永远不会成立.你想要的我认为是:

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),
Run Code Online (Sandbox Code Playgroud)

这里仍然存在一些冲突,因为约束的一部分意味着生效日期和终止日期可能都是同一天,但约束的另一部分阻止它.正如Andriy在他的评论中所说,这可以简化为单一约束.假设您并不打算允许生效日期和终止日期实际落在同一天,这可以通过单个两列约束来实现:

EffectiveDate DATE NOT NULL DEFAULT GETDATE(),    
TerminationDate DATE NOT NULL DEFAULT '99991231',
  CONSTRAINT chk_Dates CHECK 
    (EffectiveDate >= CONVERT(DATE, GETDATE()) 
     AND TerminationDate > EffectiveDate)
Run Code Online (Sandbox Code Playgroud)

虽然正如我在上面的评论中提到的,我认为像12/31/9999这样的令牌值是愚蠢的,并且不是NULL的正确替代品.您还应该非常小心使用区域的,模糊的格式,如mm/dd/yyyy.