Ввиду изменчивости входных данных, которые у вас есть, нам нужно спланировать несколько сценариев. В приведенном ниже коде предполагается, что будет ровно два символа "."символов перед сохраненной_процедурой, и что [сохраненная_процедура] будет либо заканчивать строку, либо будет сопровождаться пробелом, если строка продолжается.
SELECT TRIM('[' FROM TRIM(']' FROM --Trim brackets from final result if they exist
SUBSTR(column || ' ', --substr(string, start_pos, length), Space added in case proc name is end of str
INSTR(column || ' ', '.', 1, 2)+1, --start_pos: find second '.' and start 1 char after
INSTR(column || ' ', ' ', INSTR(column || ' ', '.', 1, 2), 1)-(INSTR(column || ' ', '.', 1, 2)+1))
-- Len: start after 2nd '.' and go until first space (subtract 2nd '.' index to get "Length")
))FROM TABLE;
Работая с середины, мы начнем с использования функции SUBSTR иконкатенация пробела до конца исходной строки. Это позволяет нам использовать пробел, чтобы найти конец элемента хранимой_процедуры, даже если это последний фрагмент строки.
Далее, чтобы найти нашу начальную позицию, мы используем INSTR для поиска второго экземпляра '.'и начать 1 позицию после.
Для аргумента длины мы находим индекс первого пробела после второго '.'а затем вычтите это. индекс.
Отсюда у нас есть [сохраненная_процедура] или сохраненная_процедура. Запуск функций TRIM для каждой скобки удалит их, если они существуют, а если нет, просто вернет имя процедуры.
Пример входных данных, основанный на приведенном выше описании:
'EXEC [svr1].[dbo].[stored_procedure]'
'EXEC [svr1].[dbo].[stored_procedure] FROM TEST'
'svr1.dbo.stored_procedure'
Примечание:Этот код написан для Oracle SQL, но может быть переведен в mySQL с использованием аналогичных функций.