SQL 我需要从字符串中提取存储过程名称

SQL I need to extract a stored procedure name from a string

我对这个网站有点陌生,但我已经查看了我的问题的许多可能答案,但其中 none 满足了我的需要。我觉得这是一个很好的挑战。开始了。

在我们的一个表格中,我们列出了用于 运行 报告的内容,这可能意味着我们可以有一个简短的 EXEC [svr1].[dbo].[stored_procedure] 或“ ...来自 svr1.dbo.stored_procedure...".

我的目标是从此字符串(列)中获取存储过程名称。我试图获取“[”和“]”之间的字符串,但在没有括号时会中断。我已经处理了几天,但似乎找不到解决方案。

非常感谢您提供的任何帮助。

提前感谢您提出这个问题。 几乎是专家

鉴于您似乎拥有的输入的可变性,我们将需要针对一些场景进行规划。下面的代码假定正好有两个“。” stored_procedure 之前的字符和 [stored_procedure] 将结束字符串,或者如果字符串继续,则后跟 space。

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 函数开始并将 space 连接到原始字符串的末尾。这允许我们使用 space 来查找 stored_procedure 的结尾,即使它是字符串的最后一段。

接下来要找到我们的起始位置,我们使用 INSTR 搜索“.”的第二个实例。并在之后开始 1 个位置。

对于长度参数,我们在第二个“.”之后找到第一个 space 的索引。然后减去那个 '.'指数。

从这里我们有 [stored_procedure] 或 stored_procedure。 运行 每个括号的 TRIM 函数将删除它们(如果它们存在),如果不存在,将仅 return 过程的名称。

基于上述描述的示例输入:

'EXEC [svr1].[dbo].[stored_procedure]'
'EXEC [svr1].[dbo].[stored_procedure] FROM TEST'
'svr1.dbo.stored_procedure'

注意:此代码是为 Oracle SQL 编写的,但可以使用类似的函数转换为 mySQL。

考虑到您的示例句子的结尾字符是 space,或者您的句子结尾没有尾随(无论是 space 还是给定示例以外的任何其他字符),并假设您没有其他点在示例之前,以下将是一种干净的方式,它将 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

Demo