gpt4 book ai didi

sql-server - 检查约束不允许我添加数据

转载 作者:行者123 更新时间:2023-12-03 19:59:14 24 4
gpt4 key购买 nike

我有一个返回 BIT 的用户定义函数。

  • 1 - 如果日期重叠
  • 0 - 如果日期不重叠

我已经测试了 UDF,它似乎运行正常。

这是我添加的以下检查约束:

ALTER TABLE [Gizmo] WITH CHECK ADD CONSTRAINT [CK_DateOverlap]
CHECK [dbo].[MyUserFunction]([GizmoName],[GizmoState],[BeginDate],[EndDate]) = 0;

该表中没有任何数据。当我去插入一条新记录时,我得到了错误

The INSERT statement conflicted with the CHECK constraint

我手动调用 UDF 进行测试,它返回 0。

如果 UDF 返回 0,我希望约束添加记录。如果它返回 1,我不想添加它。

我错过了什么?

编辑 - UDF

ALTER FUNCTION [dbo].[MyUserFunction]
(
@GizmoName AS VARCHAR(max),
@GizmoState AS VARCHAR(max),
@BeginDate AS DATETIME,
@EndDate AS DATETIME

)

RETURNS BIT
AS
BEGIN
DECLARE @Result BIT
IF EXISTS(
SELECT *
FROM Gizmos
WHERE (@GizmoName = Name AND @GizmoState = [State])
AND (@EndDate >= EffectiveFrom AND EffectiveTo >= @BeginDate)
)
BEGIN
SET @Result = 1;
END
ELSE
BEGIN
SET @Result = 0;
END
RETURN @Result
END

插入

INSERT INTO Gizmos VALUES('XXX', 'CA', '1/1/2019', '12/31/2019');

最佳答案

该行已插入到表中,并且对表应用了约束。因此数据已经可用,函数返回 1 并且事务被回滚。所以我们需要忽略第一行,然后它会按你预期的那样工作。

CREATE OR ALTER FUNCTION [dbo].[MyUserFunction]
(
@GizmoName AS VARCHAR(max),
@GizmoState AS VARCHAR(max),
@BeginDate AS DATETIME,
@EndDate AS DATETIME

)

RETURNS BIT
AS
BEGIN
DECLARE @Result BIT

IF (SELECT COUNT(Name)
FROM Gizmos
WHERE (@GizmoName = Name AND @GizmoState = [State])
AND (@EndDate >= EffectiveFrom AND EffectiveTo >= @BeginDate)
) > 1
BEGIN
SET @Result = 1;
END
ELSE
BEGIN
SET @Result = 0;
END

RETURN @Result

END
GO

关于sql-server - 检查约束不允许我添加数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58524407/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com