You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TSQL触发器IF语句无法退出问题及字段特殊字符校验咨询

解决SQL Server触发器中校验下划线字符的问题

嘿,我明白你碰到的麻烦了!问题的核心在于下划线_是SQL LIKE语句里的通配符,它会匹配任意单个字符,而不是作为字面意义的下划线来匹配。你之前写的@i_not LIKE '%_%'会把几乎所有非空的City值都判定为符合条件,这就导致IF语句一直触发错误,没法正常执行后续逻辑。

修正步骤

1. 正确匹配字面下划线

要匹配字面意义的下划线,有两种常用方法:

  • 使用方括号[]把下划线括起来,让SQL把它当作普通字符:LIKE '%[_]%'
  • 使用ESCAPE子句指定转义字符,比如用!作为转义符:LIKE '%!_%' ESCAPE '!'

2. 修复触发器的多行处理问题

另外,你的原触发器还有个隐藏问题:如果一次插入/更新多行数据,@i_not只会获取最后一行的City值,会漏掉其他行的校验。更好的做法是用EXISTS来检查所有插入/更新的行,而不是依赖单个变量。

修正后的触发器代码

ALTER TRIGGER i_validation 
ON dbo.Customer 
FOR INSERT, UPDATE 
AS
BEGIN
    -- 检查所有插入/更新的行中是否有包含@、$或_的City值
    IF EXISTS (
        SELECT 1 
        FROM inserted 
        WHERE City LIKE '%@%' 
           OR City LIKE '%$%' 
           OR City LIKE '%[_]%' -- 用方括号转义下划线
    )
    BEGIN
        THROW 50000, 'City cannot contain: "@" ,"$" ,or "_"', 1;
    END
END

说明

  • 用EXISTS代替单个变量,能确保所有插入/更新的行都被校验,避免漏检多行的情况。
  • LIKE '%[_]%'正确匹配包含下划线的字符串,不会再误判其他字符。
  • 我还把错误提示里的"First name"改成了"City",因为你校验的是City字段,避免混淆~

这样修改后,触发器就能正确阻止包含@、$或_的City值,同时处理单行和多行的插入/更新操作啦。

内容的提问来源于stack exchange,提问作者Escaper

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 03:39:24