SQL存储过程输入变量校验错误:如何确保仅含数字和逗号?
存储过程输入变量校验问题解决
问题背景
需要实现存储过程输入变量@inputvariable的校验规则:仅允许包含数字和逗号,合法示例如下:
@inputvariable = 489 @inputvariable = 489,504
原校验逻辑存在漏洞:只要变量包含至少一个数字或逗号,即便存在无效字符(如字母、特殊符号)也不会触发错误。原代码如下:
IF (@inputvariable NOT LIKE '%[0-9]%' OR @inputvariable NOT LIKE '%,%') BEGIN RAISERROR ('@inputvariable can only contain numbers and commas', 18, 1) RETURN END
错误原因
你的逻辑错误在于使用了OR运算符:
- 这个条件只会在变量完全不含数字,或者变量完全不含逗号的时候触发错误
- 如果变量同时包含数字/逗号和无效字符(比如
489x,504),两个NOT LIKE条件都不成立,错误分支不会执行
你真正需要校验的是:变量中不能存在任何非数字、非逗号的字符,而不是检查是否包含数字或逗号。
正确校验代码
使用SQL的反向字符集匹配[^0-9,],它会匹配任何不属于数字(0-9)或逗号的字符,只要匹配到就抛出错误:
IF (@inputvariable LIKE '%[^0-9,]%') BEGIN RAISERROR ('@inputvariable can only contain numbers and commas', 18, 1) RETURN END
额外优化:处理空值/空字符串
如果需要禁止变量为空,可以补充空值判断:
IF (@inputvariable IS NULL OR @inputvariable = '' OR @inputvariable LIKE '%[^0-9,]%') BEGIN RAISERROR ('@inputvariable can only contain numbers and commas, and cannot be empty', 18, 1) RETURN END
内容的提问来源于stack exchange,提问作者J B
相关产品推荐
相关产品推荐

