无法摆脱TSQL中的if语句:触发器

Esc*_*per 1 t-sql sql-server triggers

这是我的触发器,它应该阻止用户在City中"@","$"或"_".如果有两个条件,它的工作完美

ALTER TRIGGER i_validation
ON dbo.Customer
FOR INSERT, UPDATE
AS
    DECLARE @i_not NVARCHAR(200)
begin
    SELECT @i_not = dbo.Customer.City 
    FROM dbo.Customer 
    JOIN inserted ON dbo.Customer.CustomerID = inserted.CustomerID

    IF((@i_not LIKE '%@%') OR (@i_not LIKE '%$%'))
    BEGIN
        THROW 50000, 'First name cannot contain: "@" ,"$" ,or "_"', 1;
    END;
END
Run Code Online (Sandbox Code Playgroud)

但是当我添加第三个条件时:

1Version.IF(( @i_not LIKE '%@%') OR ( @i_not LIKE '%$%') or @i_not LIKE '%_%' ) 
2Version. IF((( @i_not LIKE '%@%') OR ( @i_not LIKE '%$%')) OR @i_not LIKE '%_%' ) 
Run Code Online (Sandbox Code Playgroud)

如果还有其他的话,我也尝试了第二个

ALTER TRIGGER i_validation
ON dbo.Customer
FOR INSERT, UPDATE
AS
    DECLARE @i_not NVARCHAR(200)
BEGIN
    SELECT @i_not = dbo.Customer.City 
    FROM dbo.Customer 
    JOIN inserted ON dbo.Customer.CustomerID = inserted.CustomerID

    IF ((@i_not LIKE '%@%') OR (@i_not LIKE '%$%'))
    BEGIN
        THROW 50000, 'First name cannot contain: "@" ,"$" ,or "_"', 1;
    END;
    ELSE IF (@i_not LIKE '%_%')
    BEGIN
        THROW 50000, 'First name cannot contain: "@" ,"$" ,or "_"', 1;
    END
END
Run Code Online (Sandbox Code Playgroud)

但结果是,即使城市不包含@,$,_,它也是每次都忽略或工作.

如果有3个条件,还有其他方法可以使用吗?

And*_*mar 6

您的检查失败的原因是下划线是您使用时的特殊字符LIKE.它匹配任何单个字符,就像%匹配任何文本一样.

但为什么不使用检查约束?

ALTER TABLE Customer ADD CONSTRAINT check1 CHECK (City not like '%[@$_]%');
Run Code Online (Sandbox Code Playgroud)

[@$_]是一个匹配的字符范围@,$_.下划线在字符范围内没有特殊含义.