Dav*_*ldo 7 t-sql sql-server function
我有这个功能:
CREATE FUNCTION CheckAkvNames (@Name VARCHAR(20))
RETURNS INT
AS
BEGIN
DECLARE @NoTexist int = 1
SELECT
@NoTexist = CASE WHEN COUNT(*) > 0 THEN 0 ELSE 1 END
FROM
[dbo].[Names]
WHERE
[Name] = @Name
RETURN @NoTexist
END
GO
ALTER TABLE [dbo].[Names]
ADD CONSTRAINT chkNames CHECK(dbo.CheckAkvNames([Name]) = 1);
GO
Run Code Online (Sandbox Code Playgroud)
问题是,当我在空表上运行时,我无法插入...
因此,此更改有效:
CASE WHEN (COUNT(*) - 1) > 0 THEN 0 ELSE 1 END
Run Code Online (Sandbox Code Playgroud)
为什么?有任何想法吗?
编辑:目的是仅插入不在表中的名称。我知道使用密钥会更好,问题的重点不是找到更好的解决方案,而是为什么这种解决方案不起作用。
您添加到表中的约束实际上意味着您不能在表中插入任何名称,因为对于在表中插入的任何值,该函数应返回1。
这是不可能的,因为如果插入了名称,则会违反该约束。
这是count(*) - 1起作用的原因:如果已经插入一个名称,并且您尝试插入相同的名称,则将违反约束。