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)
问题
阅读时如何格式化GETDATE
以检查dd/mm/yy
和忽略时间部分SMScounter.CounterDate
?(上面的脚本已编辑,现在可以使用)。
我怎样才能使IF
语句CHECKVALUE
与 950相比较?
我使用的是 SQL Server 2008 标准版。
您可以使用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
语句,您需要传入一个要检查的值,然后将要在BEGIN
andEND
语句中运行的代码包装起来。这是使用 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
您的检查查询中添加了一个函数,因为这将只返回包含当天最大值的单行,否则它将从所有匹配的行中返回一个随机值。如果每次写入表时都覆盖当天的值,那么这是多余的。