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)
为什么我的第一个查询不起作用?
我修改了我的脚本,以下两个版本有效!
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)
您的第一个查询的问题是在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个字母(或者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)
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
因为只要在它之前有一个开括号(如果您转义它就不会),这个括号只会被解释为特殊字符。
归档时间: |
|
查看次数: |
1446 次 |
最近记录: |