PATINDEX не является регулярным выражением. Вы можете использовать только ограниченный набор идентификаторов шаблонов и подстановочных знаков. От MSDN:
%: Любая строка из ноля или более символов.
_ (подчеркивание): Любой символ.
[]: Любой символ в указанном диапазоне ([a-f]) или set ([abcdef]).
[^]: Любой отдельный символ не в указанном диапазоне ([^ a-f]) или установлен ([^ abcdef]).
Ниже будет соответствовать девять цифр подряд, начиная с 6, 7, 8 или 9:
SET @validchars = '[6-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
Использование SUBSTRING также неправильно. Похоже, ваш код пытается исключить символы номера из строки. Вот как получить строку с номером удалены:
DECLARE @str VARCHAR(MAX)
DECLARE @validchars VARCHAR(MAX)
SET @str = 'TESTING1234 997711056 sdfgdfg'
SET @validchars = '[6-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
DECLARE @idx INT
SET @idx = PATINDEX('%'+ @validchars +'%',@str)
IF @idx > 0 AND
(@idx = LEN(@str)-8
OR PATINDEX(SUBSTRING(@str,@idx+9,1),'[0-9]')=0)
SET @str=REPLACE(@str,SUBSTRING(@str ,PATINDEX('%'+ @validchars +'%',@str), 9),'')
ELSE SET @str = ''
SELECT @str
Вы утверждаете вы хотите, чтобы получить только число из строки; Вот как это сделать:
DECLARE @str VARCHAR(MAX)
DECLARE @validchars VARCHAR(MAX)
SET @str = 'TESTING1234 997711056 sdfgdfg'
SET @validchars = '[6-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
DECLARE @idx INT
SET @idx = PATINDEX('%'+ @validchars +'%',@str)
IF @idx > 0 AND
(@idx = LEN(@str)-8
OR PATINDEX(SUBSTRING(@str,@idx+9,1),'[0-9]')=0)
SET @str=SUBSTRING(@str ,PATINDEX('%'+ @validchars +'%',@str), 9)
ELSE SET @str = ''
SELECT @str
спасибо за помощь и полезную информацию – csotelo
, но проверяю ... Я все еще возвращаю одну и ту же строку: S – csotelo
@csotelo Отредактированный ответ, чтобы показать, как получить строку с номером или без него и точно соответствовать девяти цифрам. –