【问题标题】:T-SQL query trying to sp_send_dbmail尝试 sp_send_dbmail 的 T-SQL 查询
【发布时间】:2017-03-22 11:19:44
【问题描述】:

我有以下脚本(全部使用系统数据库)。

以下是我的脚本。它基本上是一个脚本,用于识别运行时间超过 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;

我的目标是仅在有长时间运行的作业时触发一封电子邮件 - 但目前似乎每次运行时都会发送一封电子邮件(结果为空白)。

【问题讨论】:

  • 尝试排位赛sysjobs 喜欢msdb.dbo.sysjobs
  • 成功了,谢谢。我在这两个地方都没有完全合格(只有一个)。但是现在发现 IF EXISTS 部分的问题,即即使没有找到结果也会触发电子邮件。
  • 如果 you 将其标记为 database-administration - 它确实与 programming 没有任何关系,因此这里是题外话属于dba.stackexchange.com - 投票支持。

标签: sql-server tsql ssms database-administration


【解决方案1】:

想通了……

在我的例子中,IF COUNT > 0IF 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多