【发布时间】:2019-10-23 13:49:52
【问题描述】:
我有一个返回 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');
【问题讨论】:
-
我对检查约束不太熟悉,但检查关键字后面的整个语句不应该在括号内吗?
-
好吧,UDF 还接受另外两个参数,
GizmoName和GizmoState。这另外两个输入是否有可能决定位输出? -
@ArloGuthrie 也许,但是 OP 正在为检查约束调用 UDF,所以您 do 看到的括号实际上可能属于那里。
-
我们能看到 UDF 吗?可能存在一些问题,因为表中实际上没有数据可以检查重叠
-
请至少提供 UDF 和您尝试插入的值。只要我们知道数据类型,缩短的表定义会有所帮助,但并不重要。
标签: sql-server tsql stored-functions check-constraints