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
相关产品推荐
相关产品推荐

