检查字符串的格式是否正确。正确的格式如下:0000/000000。到目前为止,这就是我所得到的:
declare @ID nvarchar = '0000/00000'
SELECT (case when len(@id) not between 1 and 12 OR @id not like( '[0-9][0-9][0-9][0-9]' + '/' + '[0-9][0-9][0-9][0-9][0-9]')
OR LEFT(@id,13) LIKE '%[0-9]&' then 'OK' else 'ERROR' end
为什么不直接使用not like
?
where @id not like '[0-9][0-9][0-9][0-9]/[0-9][0-9][0-9][0-9][0-9]'
我假设"0"表示允许使用任何数字。
首先,这将是一个问题:
declare @ID nvarchar = '0000/00000'
此:
declare @ID nvarchar = '0000/00000';
SELECT @ID LEN(@ID), DATALENGTH(@ID);
退货:
ID LEN
---- ----
0 1
考虑到这一点,请注意:PATINDEX({your pattern},@Id)
将返回一个自然的布尔结果。
DECLARE @ID1 NVARCHAR(1000) = '5555/12312',
@ID2 NVARCHAR(1000) = '1234/12345678',
@pattern VARCHAR(100) = '[0-9][0-9][0-9][0-9]/[0-9][0-9][0-9][0-9][0-9]';
SELECT IsCool = PATINDEX(@pattern,f.Id)
FROM (VALUES(@ID1),(@ID2)) AS f(Id);
退货:
IsCool
-----------
1
0
如果0000/00000
的意思是:四位数字+"/"+五位数字,那么这些表达式都有效(注意,我将模式作为一个变量,以使代码更干净、更容易阅读,这不是必需的(:
DECLARE @ID NVARCHAR(1000) = '5555/12312',
@pattern VARCHAR(100) = '[0-9][0-9][0-9][0-9]/[0-9][0-9][0-9][0-9][0-9]';
SELECT CASE PATINDEX(@Pattern,@ID) WHEN 1 THEN 'Ok' ELSE 'Error' END;
SELECT IIF(PATINDEX(@Pattern,@ID)>0,'Ok','Error');
SELECT CHOOSE(PATINDEX(@Pattern,@ID)+1,'Error','Ok');
您的代码表明@ID的长度最多可以是12个字符。例如,可以接受的格式为:
0000/00000
00000/00000
然后你可以这样做:
DECLARE @ID NVARCHAR(1000) = '5555/12312';
SELECT CASE WHEN LEN(@ID)<13 AND SIGN(PATINDEX('%[0-9][0-9]',@ID)) *
PATINDEX('[0-9][0-9][0-9][0-9]/[0-9][0-9][0-9][0-9][0-9]%',@ID) = 1
THEN 'Ok' ELSE 'Error' END;
最后两个想法:
LEN({string})
不能为负;LEN(@ID(<13就能搞定- 如果最大长度真的是12,那么使参数或变量NVARCHAR(13(。例如,通过这种方式,有人传入一个8000个字符的字符串,SQL不必扫描整个字符串来确定它是无效的