微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么我的 SQL Server 约束说存在冲突?

如何解决为什么我的 SQL Server 约束说存在冲突?

我正在尝试使用以下脚本向 sql Server 表添加约束:

CREATE FUNCTION CheckHREmpIDrequired()
RETURNS BIT AS
BEGIN
    DECLARE @ret BIT;
    SET @ret = 0;
    SELECT @ret = 1 WHERE EXISTS (SELECT 1 FROM GeneralSettings WHERE [Key] = 'HR_EMP_ID_required' AND TRIM(LOWER([Value])) = 'true');
    RETURN @ret;
END
GO

CREATE FUNCTION CheckHREmpIDAndDomainValid(@HREmpID varchar(10),@Domain varchar(50))
RETURNS BIT AS
BEGIN
  DECLARE @required BIT;
  EXEC @required = dbo.CheckHREmpIDrequired;
  IF ((@HREmpID IS NULL OR TRIM(@HREmpID) = '') AND @required = 1)
  BEGIN
    RETURN 0
  END
  IF (@HREmpID IS NOT NULL AND LEN(@HREmpID) > 0)
  BEGIN
    DECLARE @ret BIT;
    SET @ret = 0;
    SELECT @ret = 1 WHERE NOT EXISTS (SELECT 1 FROM Employee WHERE HREmpID = @HREmpID AND Domain = @Domain);
    RETURN @ret;
  END
  RETURN 1
END
GO

ALTER TABLE [dbo].[Employee]
    ADD CONSTRAINT [CheckUniqueHREmpIDAndDomain] CHECK (dbo.CheckHREmpIDAndDomainValid(dbo.Employee.HREmpID,dbo.Employee.Domain) = 1);
GO

约束基本上检查列 HREmpID 和 Domain 的组合是否唯一。在不需要 HREmpID 且未提供的情况下,允许重复。

在约束中调用了两个函数:CheckHREmpIDAndDomainValid 和 CheckHREmpIDrequired。 CheckHREmpIDAndDomainValid 是从约束调用的主要函数。它检查 HREmpID 和域组合是否唯一,如果需要,提供 HREmpID。 CheckHREmpIDrequired 检查是否需要 HREmpID。

然而,当我运行这个脚本时,它告诉我:

The ALTER TABLE statement conflicted with the CHECK constraint "CheckUniqueHREmpIDAndDomain". The conflict occurred in database "TBoardDB",table "dbo.Employee".

但是Employee表中的所有记录都是唯一的:

enter image description here

并且不需要 HREmpID。

与约束冲突的是什么?有人看到脚本有问题吗?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。