2017-03-22 26 views
0

我有下面的腳本(全部使用系統數據庫)。嘗試sp_send_dbmail的T-SQL查詢

下面是我的腳本。它基本上是一個用於識別運行時間超過240分鐘的SQL Server代理作業的腳本。

--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; 

我的目標是當有長時間運行的作業只有觸發電子郵件 - 但電子郵件似乎目前每次運行時發送(空白結果)。

+1

嘗試像'msdb.dbo.sysjobs'這樣的符合條件的'sysjobs' – TheGameiswar

+0

完成了這個訣竅,謝謝。我在兩個地方都沒有完全資格(只有一個)。但是現在發現IF EXISTS部分存在問題,即使沒有找到結果,也會觸發電子郵件。 –

+0

如果**你**標記爲'數據庫管理' - 它確實與**編程**沒有任何關係,因此它在這裏是脫離主題並屬於[dba.stackexchange.com](http ://dba.stackexchange.com) - 投票移動。 –

回答

0

想通了......

在我的情況下,如果count> 0更好地工作比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