Вырезаем числовую часть из начала строки в transact-sql

Имеем сроку, начинающуюся с целого числа, вида 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')

Источник