如何找到发送特定电子邮件的工作?

Mar*_*lli 2 sql-server database-mail jobs sql-server-2016 string-searching

我有一份工作向一组用户发送不相关的电子邮件。

电子邮件的标题是Staging -> [AUPAIR] arrivalDate trigger issue

当我使用上面的标题查询 msdb 数据库中的作业表时,我没有得到答案:

USE [msdb]
GO
SELECT    j.job_id,
    s.srvname,
    j.name,
    js.step_id,
    js.command,
    j.enabled
FROM    dbo.sysjobs j
JOIN    dbo.sysjobsteps js
    ON    js.job_id = j.job_id
JOIN    master.dbo.sysservers s
    ON    s.srvid = j.originating_server_id
WHERE    js.command LIKE N'%Staging -> [AUPAIR] arrivalDate trigger issue%'
Run Code Online (Sandbox Code Playgroud)

只有当我改变我的查询如下时,我才能找到强盗工作:

USE [msdb]
GO
SELECT    j.job_id,
    s.srvname,
    j.name,
    js.step_id,
    js.command,
    j.enabled
FROM    dbo.sysjobs j
JOIN    dbo.sysjobsteps js
    ON    js.job_id = j.job_id
JOIN    master.dbo.sysservers s
    ON    s.srvid = j.originating_server_id
--WHERE    js.command LIKE N'Staging -> [AUPAIR] arrivalDate trigger issue%'
WHERE    js.command LIKE N'%Staging -> %'
Run Code Online (Sandbox Code Playgroud)

这是 jobstep 上的命令:

if exists (
select count(1) as total
,year(modify_date) as [Year]
,month(modify_date) as [Month]
from repl_aupair r
where r.arrivaldate is not null
and junocore_applicationid not in(
select applicationid from junocore.dbo.replicationUpdateControl
where arrivaldatechanged = 1 )
and modify_Date >='2017-01-26 00:38:46.197'
group by year(modify_date),month(modify_date)
having year(modify_date) >= 2017
--order by [Year] desc
)
begin
EXEC msdb.dbo.sp_send_dbmail
            @profile_name = 'DBA',
            @recipients = 'my_emails@mycompany.com',
            @body = 'APIA_Repl_Sub.dbo.repl_aupair arrivalDate not null and replicationUpdateControl arrivalDateChanged still 0',
            @subject = 'Staging -> [AUPAIR] arrivalDate trigger issue ';
end
Run Code Online (Sandbox Code Playgroud)

为什么我的第一个查询不起作用?

结论:

我修改了我的脚本,以下两个版本有效!

EzLo回答之后

USE [msdb]
GO
SELECT  j.job_id,
    s.srvname,
    j.name,
    js.step_id,
    js.command,
    j.enabled
FROM    dbo.sysjobs j
JOIN    dbo.sysjobsteps js
    ON  js.job_id = j.job_id
JOIN    master.dbo.sysservers s
    ON  s.srvid = j.originating_server_id
WHERE js.command  LIKE '%Staging -> \[AUPAIR] arrivalDate trigger issue%' ESCAPE '\'


USE [msdb]
GO
SELECT  j.job_id,
    s.srvname,
    j.name,
    js.step_id,
    js.command,
    j.enabled
FROM    dbo.sysjobs j
JOIN    dbo.sysjobsteps js
    ON  js.job_id = j.job_id
JOIN    master.dbo.sysservers s
    ON  s.srvid = j.originating_server_id
WHERE js.command  LIKE '%Staging -> [[]AUPAIR] arrivalDate trigger issue%'
Run Code Online (Sandbox Code Playgroud)

EzL*_*zLo 8

您的第一个查询的问题是在LIKE运算符中使用了未转义的括号。

使用LIKE运算符时,有一些特殊字符(例如括号)需要转义才能查找。括在方括号中的字符将告诉 SQL 引擎查找其中列出的任何字符之间的匹配项(与正则表达式相同)。

DECLARE @string VARCHAR(100) = 'ABC'

SELECT 'match!' WHERE @string LIKE '%[CX]%' -- Sting must have a C or an X
-- Result: match!
Run Code Online (Sandbox Code Playgroud)

在你的情况下,使用[AUPAIR]等的内部将只匹配1个字母(或者AUPIR),而不是整个单词。

DECLARE @string VARCHAR(100) = 'Staging -> [AUPAIR] arrivalDate trigger issue'

SELECT 'match!' WHERE @string LIKE '%Staging -> [AUPAIR] arrivalDate trigger issue%'
-- Result: (none)
Run Code Online (Sandbox Code Playgroud)

然而,这将与以下字符串匹配(仅 1 个字母!):

'Staging -> A arrivalDate trigger issue'
'Staging -> U arrivalDate trigger issue'
'Staging -> P arrivalDate trigger issue'
'Staging -> I arrivalDate trigger issue'
'Staging -> R arrivalDate trigger issue'
Run Code Online (Sandbox Code Playgroud)

要正确搜索括号,您可以使用 2 种解决方案:

  • 声明一个自定义ESCAPE字符。

    DECLARE @string VARCHAR(100) = 'Staging -> [AUPAIR] arrivalDate trigger issue'
    
    SELECT 'match!' WHERE @string LIKE '%Staging -> \[AUPAIR] arrivalDate trigger issue%' ESCAPE '\'
    -- Result: match!
    
    Run Code Online (Sandbox Code Playgroud)
  • 用括号将左括号括起来。

    DECLARE @string VARCHAR(100) = 'Staging -> [AUPAIR] arrivalDate trigger issue'
    
    SELECT 'match!' WHERE @string LIKE '%Staging -> [[]AUPAIR] arrivalDate trigger issue%'
    -- Result: match!
    
    Run Code Online (Sandbox Code Playgroud)

请注意,没有必要对结束括号进行转义,LIKE因为只要在它之前有一个开括号(如果您转义它就不会),这个括号只会被解释为特殊字符。