ユーザーのグループに無関係なメールを送信する仕事がありました。
メールのタイトルは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 = '[email protected]',
@body = 'APIA_Repl_Sub.dbo.repl_aupair arrivalDate not null and replicationUpdateControl arrivalDateChanged still 0',
@subject = 'Staging -> [AUPAIR] arrivalDate trigger issue ';
end
最初のクエリが機能しないのはなぜですか?
スクリプトを変更すると、次の2つのバージョンが機能します。
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%'
最初のクエリの問題は、エスケープされていないブラケットを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]
like内の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)
ただし、これは次の文字列(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
文字を宣言します。
DECLARE @string VARCHAR(100) = 'Staging -> [AUPAIR] arrivalDate trigger issue'
SELECT 'match!' WHERE @string LIKE '%Staging -> \[AUPAIR] arrivalDate trigger issue%' ESCAPE '\'
-- Result: match!
開始ブラケットをブラケットで囲みます。
DECLARE @string VARCHAR(100) = 'Staging -> [AUPAIR] arrivalDate trigger issue'
SELECT 'match!' WHERE @string LIKE '%Staging -> [[]AUPAIR] arrivalDate trigger issue%'
-- Result: match!
閉じ括弧をエスケープする必要はありませんがあることに注意してください。これは、その前に開始文字がある場合に限り、LIKE
特殊文字としてのみ解釈されるためです(これにより、あなたがそれをエスケープしたかどうか)。