Search code examples
sql-servert-sqlssmsdatabase-administration

T-SQL query trying to sp_send_dbmail


I have the below script (all using System Databases).

Below is my script. It's basically a script to identify SQL Server Agent jobs which are running longer than 240 minutes.

--Step 1: Decide if anything is actually running longer than 240 mins
IF EXISTS 
    (
    SELECT      p.spid, 
                j.name, 
                p.program_name, 
                ISNULL(DATEDIFF(mi, p.last_batch, GETDATE()), 0) AS MinutesRunning, 
                p.last_batch
    FROM        master.sys.sysprocesses AS p 
                INNER JOIN sysjobs AS j 
                ON dbo.udf_SysJobs_GetProcessid(j.job_id) = SUBSTRING(p.program_name, 32, 8)
    WHERE     (p.program_name LIKE 'SQLAgent - TSQL JobStep (Job %') AND (ISNULL(DATEDIFF(mi, p.last_batch, GETDATE()), 0) >= 240)
    )



--Step 2: Set the variable format and define a query
DECLARE @longjob NVARCHAR(MAX);
SET @longjob = 
'SELECT     p.spid, 
                j.name, 
                p.program_name, 
                ISNULL(DATEDIFF(mi, p.last_batch, GETDATE()), 0) AS MinutesRunning, 
                p.last_batch
    FROM        master.sys.sysprocesses AS p 
                INNER JOIN sysjobs AS j 
                ON dbo.udf_SysJobs_GetProcessid(j.job_id) = SUBSTRING(p.program_name, 32, 8)
    WHERE     (p.program_name LIKE ''SQLAgent - TSQL JobStep (Job %'') AND (ISNULL(DATEDIFF(mi, p.last_batch, GETDATE()), 0) >= 240)'




--Step 3: Execute the email and set content
EXEC msdb.dbo.sp_send_dbmail            
@profile_name = N'SERVER',          
@recipients = 'EMAIL', 
@subject = 'SUBJECT',
@body = 'TEXT',
@query = @longjob,
@attach_query_result_as_file = 1;

My aim is to trigger an email only when there are long running jobs - but an email currently seems to be sent each time it runs (with blank results) .


Solution

  • Figured it out...

    In my case, IF COUNT > 0 worked better than IF EXISTS.

        IF  
            (
            SELECT      COUNT(*)
            FROM        master.sys.sysprocesses AS p 
                        INNER JOIN msdb.dbo.sysjobs AS j 
                        ON msdb.dbo.udf_SysJobs_GetProcessid(j.job_id) = SUBSTRING(p.program_name, 32, 8)
            WHERE     (p.program_name LIKE 'SQLAgent - TSQL JobStep (Job %') AND (ISNULL(DATEDIFF(mi, p.last_batch, GETDATE()), 0) >= 240)
            ) > 0
    
        BEGIN
    ...
    snip
    ...
        END