Во-первых, это будет проблемой:
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 0000/000000 0000/0000000
Тогда вы можете сделать это:
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 сделает трюк </li> - Если максимальная длина действительно 12, тогда создайте параметр или переменную NVARCHAR (13). Таким образом, например, кто-то передает строку длиной 8000 символов, SQL не нужно сканировать все это, чтобы определить, что оно недопустимо.