【发布时间】:2018-07-17 18:57:08
【问题描述】:
使用 SQL Server 2014,我想在字段中搜索并返回找到的字符串的所有实例以及以下单词。例如,列中的文本可能是:
"exec sproc1 然后在此处添加一些文本,然后可能执行 sproc2 exec storedproc3 和可能 exec sproc1"
我想优雅地返回“sproc1, sproc2, storedproc3, sproc1”,因为每个都是 exec 或 execute 之后的单词(由空格分隔)。正如您在示例中看到的那样,前导词可能会有所不同,存储过程名称的长度也可能会有所不同。我已经能够返回 exec/execute 的第一次使用;我的问题是有时有多个(见下文)。
REPLACE(REPLACE(CASE
WHEN [sJSTP].[subsystem]='TSQL' AND CHARINDEX('EXECUTE',[sJSTP].[command],1)>0
THEN SUBSTRING([sJSTP].[command],CHARINDEX('EXECUTE',[sJSTP].[command],1)+8,
IIF(
CHARINDEX(' ',[sJSTP].[command],CHARINDEX('EXECUTE',[sJSTP].[command],1)+8)>0,
CHARINDEX(' ',[sJSTP].[command],CHARINDEX('EXECUTE',[sJSTP].[command],1)+8)-CHARINDEX('EXECUTE',[sJSTP].[command],1)-8,
LEN([sJSTP].[command])))
WHEN [sJSTP].[subsystem]='TSQL' AND CHARINDEX('EXEC',[sJSTP].[command],1)>0 AND CHARINDEX('DCEXEC',[sJSTP].[command],1)<=0
THEN SUBSTRING([sJSTP].[command],CHARINDEX('EXEC',[sJSTP].[command],1)+5,
IIF(
CHARINDEX(' ',[sJSTP].[command],CHARINDEX('EXEC',[sJSTP].[command],1)+5)>0,
CHARINDEX(' ',[sJSTP].[command],CHARINDEX('EXEC',[sJSTP].[command],1)+5)-CHARINDEX('EXEC',[sJSTP].[command],1)-5,
LEN([sJSTP].[command])))
END,'[',''),']','') AS sprocname
它的最终用途是从 msdb..sysjobsteps 表中解析作业命令,以查看正在使用的存储过程。
编辑:添加示例数据
示例 1: exec Quarterly_run 1, 'BW' exec Quarterly_run_2 1, 'QR' 执行季度运行 2,“增值服务” 执行季度运行 1,'WR' 执行季度运行 3,“RW” exec Quarterly_run_2 1, 'ASF' exec Quarterly_run_3 1, '全部'
示例 2: 声明@rundate datetime, @rptqtr datetime, @qtr int
设置@rundate = getdate() 设置@rptqtr = '06/30/2016'
设置@qtr = (选择日期差异(季度,@rptqtr,@rundate))
执行季度提取@qtr
示例 3: 执行 Daily_Sync_Process 执行 Daily_Process
【问题讨论】:
-
您需要一个实际的字符串拆分器,而不仅仅是 charindex。如果您可以分享一些示例数据作为您所苦苦挣扎的数据,我可以提供帮助。或者,如果你想自己解决它,这里有一些很棒的分离器。 sqlperformance.com/2012/07/t-sql-queries/split-strings
-
那些没有明确使用 exec 或 execute 的作业呢?
-
已添加示例数据;感谢您提供任何帮助!至于不使用 exec 或 execute 的作业 - 在我们的环境中不会发生,所以它不适用于这里,但是很好!
标签: sql sql-server parsing text-parsing