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
我对这个网站有点陌生,但我已经查看了我的问题的许多可能答案,但其中 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