如何限制SQL varchar字符串仅允许12位数字加1个'-'符号?
解决方案
要实现你需要的格式限制,核心是确保输入字符串必须包含且仅包含一个'-',其余为12位数字,同时禁止纯数字输入。修改后的代码逻辑如下:
declare @personNr varchar(13) declare @dashCount int declare @pureDigits varchar(12) set @personNr = '990511-834678' -- 测试用例:符合格式的13位字符串 -- 计算字符串中'-'的数量 set @dashCount = LEN(@personNr) - LEN(REPLACE(@personNr, '-', '')) -- 提取去掉'-'后的纯数字部分 set @pureDigits = REPLACE(@personNr, '-', '') -- 验证条件: -- 1. 恰好有1个'-' -- 2. 去掉'-'后全为数字 -- 3. 纯数字部分长度为12(即总长度13) -- 4. 不含非法的'+'字符 if @dashCount = 1 and @pureDigits NOT LIKE '%[^0-9]%' and LEN(@pureDigits) = 12 and CHARINDEX('+', @personNr) = 0 print '1' -- 格式通过 else print '0' -- 格式不通过
修改说明:
- 移除了原代码中允许纯数字通过的
@personNr NOT LIKE '%[^0-9]%'条件,这是导致13位纯数字被误判的关键原因 - 通过
LEN(@personNr) - LEN(REPLACE(@personNr, '-', ''))精确统计'-'的数量,确保仅存在一个分隔符 - 验证去掉'-'后的字符串长度为12,保证总长度为13(12位数字+1个'-')
- 保留了对'+'的检查,确保输入不含非法字符
测试场景验证:
- 输入
'990511-834678'(12位数字+1个'-')→ 输出1 - 输入
'9905118346789'(13位纯数字)→ 输出0 - 输入
'990511--8346'(多个'-')→ 输出0 - 输入
'990511a834678'(含非数字字符)→ 输出0
内容的提问来源于stack exchange,提问作者Hannah Twete
相关产品推荐
相关产品推荐

