web-dev-qa-db-ja.com

特定のメールを送信するジョブを見つけるにはどうすればよいですか?

ユーザーのグループに無関係なメールを送信する仕事がありました。

メールのタイトルは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%'
2

最初のクエリの問題は、エスケープされていないブラケットを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文字のみに一致します(AUPIまたは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特殊文字としてのみ解釈されるためです(これにより、あなたがそれをエスケープしたかどうか)。

8
EzLo