我的工作是给一群用户发送一封不相关的电子邮件。
邮件的标题是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%'
只有当我将查询更改如下时,才能找到强盗的工作:
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 -> %'
这是作业步骤上的命令:
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
为什么我的第一个查询不起作用?
我修改了我的脚本,下面的两个版本起作用了!
在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%'
发布于 2018-07-16 02:50:39
第一个查询的问题是在LIKE
操作符中使用未转义括号。
在使用LIKE
运算符时,有一些特殊字符(如括号),如果要查找它们,则需要转义。括在括号中的字符将告诉SQL引擎查找所列字符(与正则表达式相同)之间的匹配。
DECLARE @string VARCHAR(100) = 'ABC'
SELECT 'match!' WHERE @string LIKE '%[CX]%' -- Sting must have a C or an X
-- Result: match!
在您的例子中,使用类似的[AUPAIR]
只匹配一个字母( A
、U
、P
、I
或R
),而不是整个单词。
DECLARE @string VARCHAR(100) = 'Staging -> [AUPAIR] arrivalDate trigger issue'
SELECT 'match!' WHERE @string LIKE '%Staging -> [AUPAIR] arrivalDate trigger issue%'
-- Result: (none)
但是,这将与以下字符串(仅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'
要正确搜索括号,可以使用2种解决方案:
ESCAPE
字符。声明@string (100)=‘暂存-> 奥帕尔 arrivalDate触发器’SELECT‘匹配!’其中@字符串,如‘%暂存-> [AUPAIR] arrivalDate触发问题%’转义'\‘-结果:匹配!请注意,没有必要转义结束括号,因为这个字符只会被解释为一个LIKE
特殊字符,只要它前面有一个开头字符(如果您转义了它,它就不会是一个特殊字符)。
https://dba.stackexchange.com/questions/212295
复制相似问题