T-SQL疯狂功能结果

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)

为什么?有任何想法吗?

编辑:目的是仅插入不在表中的名称。我知道使用密钥会更好,问题的重点不是找到更好的解决方案,而是为什么这种解决方案不起作用。

for*_*pas 5

您添加到表中的约束实际上意味着您不能在表中插入任何名称,因为对于在表中插入的任何值,该函数应返回1。
这是不可能的,因为如果插入了名称,则会违反该约束。
这是count(*) - 1起作用的原因:如果已经插入一个名称,并且您尝试插入相同的名称,则将违反约束。