创建作业以在表值大于 x 时使用 sp_send_dbmail 发送警报

sco*_*tus 5 sql-server t-sql database-mail alerts

问题

SMScounter.Counter用于从服务累积使用。该服务的编程上限为 1000。我想在超出此上限时提醒用户。

表创建

CREATE TABLE [dbo].[SMSCounter](
  [Counter] [int] NOT NULL,
  [CounterDate] [datetime] NOT NULL )
Run Code Online (Sandbox Code Playgroud)

示例数据

380, 2012-09-10 00:00:00.000
177, 2012-10-14 00:00:00.000
999, 2012-11-16 00:00:00.000
Run Code Online (Sandbox Code Playgroud)

作业脚本

下面的脚本是我尝试创建一个计划作业,如果SMScounter.Counter大于 950 ,它将每小时检查一次。

USE DATABASEname
select (Counter) as CHECKVALUE from SMSCounter where smscounter.CounterDate  = DATEADD(dd, DATEDIFF(dd, 0, GETDATE()),0)    
IF CHECKVALUE > 950

BEGIN

EXEC msdb.dbo.sp_send_dbmail
  @recipients=N'scott@mydomain.com',
  @body='1000 Daily SMS cap near', 
  @subject ='1000 Daily SMS cap near',
  @profile_name ='SCOTT',
  @query =
    'USE DATABASEname
     (select * from SMSCounter where CounterDate = GETDATE())'

END
Run Code Online (Sandbox Code Playgroud)

问题

  1. 阅读时如何格式化GETDATE以检查dd/mm/yy和忽略时间部分SMScounter.CounterDate?(上面的脚本已编辑,现在可以使用)。

  2. 我怎样才能使IF语句CHECKVALUE与 950相比较?

我使用的是 SQL Server 2008 标准版。

Stu*_*ore 5

您可以使用convert (date, GETDATE()) 仅获取“日期”部分:


select GETDATE(), convert (date, GETDATE())
----------------------- ----------
2012-11-16 08:58:20.750 2012-11-16
Run Code Online (Sandbox Code Playgroud)

如果您只打算比较“日期”部分,可能值得将表中的数据类型更改为DATE,以节省每次查询时都必须进行转换。

对于IF语句,您需要传入一个要检查的值,然后将要在BEGINandEND语句中运行的代码包装起来。这是使用 sysobjects 表的示例:


declare @cnt integer
select @cnt=COUNT(1) from sysobjects

if @cnt>50
begin
  select 'hello'
end
Run Code Online (Sandbox Code Playgroud)

如果您的数据库中有 50 个以上的对象,它会打招呼

所以在你的情况下:


USE DATABASEname
go
declare @counter integer

select @counter=MAX([Counter]) from SMSCounter where convert(date,CounterDate) = convert(date,GETDATE())

IF @counter > 950
BEGIN
  EXEC msdb.dbo.sp_send_dbmail
  @recipients=N'scott@mydomain.com',
  @body='1000 Daily SMS cap near',
  @subject ='1000 Daily SMS cap near',
  @profile_name ='SCOTT',
  @query =  '(select * from DATABASEname.dbo.SMSCounter where convert(date,CounterDate) = convert)(Date,GETDATE()))'
END
Run Code Online (Sandbox Code Playgroud)

我在MAX您的检查查询中添加了一个函数,因为这将只返回包含当天最大值的单行,否则它将从所有匹配的行中返回一个随机值。如果每次写入表时都覆盖当天的值,那么这是多余的。