SQL мне нужно извлечь имя хранимой процедуры из строки - PullRequest
1 голос
/ 22 октября 2019

Я немного новичок в этом сайте, но я просмотрел много возможных ответов на мой вопрос, но ни один из них не ответил на мою потребность. У меня такое чувство, что это хороший вызов. Вот и все.

В одной из наших таблиц мы перечисляем, что используется для запуска отчета, это может означать, что у нас может быть короткий EXEC [svr1]. [Dbo]. [Store_procedure] или "... Из svr1.dbo.stored_procedure ... ".

Моя цель - получить имя хранимой процедуры из этой строки (столбца). Я пытался получить строку между '[' и ']', но она разрывается, когда нет скобок. Я занимался этим несколько дней и, похоже, просто не могу найти решение.

Любая помощь, которую вы можете оказать, очень ценится.

Заранее благодарю за внимание к этому вопросу. almostanexpert

Ответы [ 2 ]

0 голосов
/ 22 октября 2019

Учитывая, что конечный символ ваших примеров предложений является пробелом, или ваши предложения заканчиваются без запаздывания (будь то пробел или любой другой символ, кроме заданных образцов), и при условии, что у вас нет других точек перед выборками, следующее будет чистым способомкоторый использует substring(), len(), charindex() и replace() вместе:

with t(str) as
(
 select '[svr1].[dbo].[stored_procedure]' union all
 select 'before svr1.dbo.stored_procedure someting more' union all
 select 'abc before svr1.dbo.stored_procedure' 
), t2(str) as
(
 select replace(replace(str,'[',''),']','') from t
), t3(str) as
(
 select substring(str,charindex('.',str)+1,len(str)) from t2 
)
select 
       substring(  
                 str,
                 charindex('.',str)+1,
                 case 
                 when charindex(' ',str) > 0 then
                      charindex(' ',str)
                 else
                           len(str)
                 end - charindex('.',str)
                ) as "Result String"  
   from t3;

Result String
----------------
stored_procedure
stored_procedure 
stored_procedure

Демо

0 голосов
/ 22 октября 2019

Ввиду изменчивости входных данных, которые у вас есть, нам нужно спланировать несколько сценариев. В приведенном ниже коде предполагается, что будет ровно два символа "."символов перед сохраненной_процедурой, и что [сохраненная_процедура] будет либо заканчивать строку, либо будет сопровождаться пробелом, если строка продолжается.

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 с использованием аналогичных функций.

...