Имеем сроку, начинающуюся с целого числа, вида 112-ОМГ, желаем вырезать из нее числовую часть. На stackoverflow приводится следующий код
declare @str varchar(50) set @str = '112-ОМГ ' select left(@str, patindex('%[^0-9]%', @str + '.') - 1) select patindex('%[^0-9]%', @str) -- для иллюстрации работы patindex
Небольшое пояснение к механике его работы. Функция left вырезает левую часть строки с заданным количеством симоволов.
Функция pathindex находит начальную позицию для заданного шаблона, нумерация начинается с 1. Согласно описанию шаблонов в MS SQL шаблон вида %[^0-9]% описывает любую строку, не имеющую в своем составе символов 0-9 (дополнительно про символ ^ в шаблонах t-sql).
Для строки 112-ОМГ patindex вернет 4 и соответственно left вырежет не только числовую часть, но и первый символ нечисловой, значит это значение надо уменьшить на 1.
Зачем нужно прибавление точки к строке? В случае пустой строки patindex вернет 0, который является недопустимым значением для left, так что мы просто гарантируем минимальную длину строки в 1 символ
Если числовую часть надо отконвертировать в int можно использовать например такую функцию
create function dbo.int_from_str (@str varchar(500)) returns int as begin declare @int as int set @int = 0 set @str = ltrim(rtrim(@str)) set @str = left(@str, patindex('%[^0-9]%', @str + '.') - 1) if @str is not null and @str <> '' begin set @int = cast(@str as int) end return @int end view source print ? select dbo.IntFromStr ('0Ч/Д') select dbo.IntFromStr ('84 ') select dbo.IntFromStr ('4.') select dbo.IntFromStr ('') select dbo.IntFromStr (null) select dbo.IntFromStr ('ч/д') select dbo.IntFromStr (' 385-F')