首页 > 解决方案 > SSMS 检查约束不允许使用有效数据更新表

问题描述

我在脚本表中的表设计中有以下内容...创建到...SSMS的新查询窗口:

CREATE TABLE [DirectMarketing].[Opportunity](
    [OpportunityID] [int] NOT NULL,
    [ProspectID] [int] NOT NULL,
    [DateRaised] [date] NOT NULL,
    [Likelihood] [tinyint] NOT NULL,
    [Rating] [char](1) NOT NULL,
    [EstimatedClosingDate] [date] NOT NULL,
    [EstimatedRevenue] [decimal](10, 2) NOT NULL
) ON [PRIMARY]
GO

SET ANSI_PADDING ON
GO

ALTER TABLE [DirectMarketing].[Opportunity] ADD  CONSTRAINT [DF_Opportunity_DateRaised]  DEFAULT (getdate()) FOR [DateRaised]
GO

ALTER TABLE [DirectMarketing].[Opportunity]  WITH NOCHECK ADD  CONSTRAINT [CK_Opportunity] CHECK  (([DateRaised]=getdate()))
GO

ALTER TABLE [DirectMarketing].[Opportunity] CHECK CONSTRAINT [CK_Opportunity]
GO

但是当我尝试通过在表中输入数据来测试它时,我不断收到一个错误,说没有更新行。请参阅下图了解输入的数据和随后的错误。我做错了什么?

在此处输入图像描述

标签: sql-servercheck-constraintsssms-2014

解决方案


该表达式[DateRaised]=GETDATE()正在比较date和的类型datetime。由于datetime具有更高的优先级,日期值将转换为具有午夜时间的日期时间。由于非午夜时间,比较然后返回 false。

解决方案是添加一个CAST

ALTER TABLE [DirectMarketing].[Opportunity] 
    ADD  CONSTRAINT [CK_Opportunity] CHECK ([DateRaised]=CAST(getdate() AS date));

推荐阅读