根据“自动范围”和“触发电子邮件”选择“值”

时间:2012-10-03 13:39:46

标签: sql sql-server tsql triggers jobs

要从中查询数据范围的表:

Id  Variance
1     2
2     17
3     7
4     4
5     20
6     1
7     111
8     8
9     18
10    67

另一个有

的表
 Freq    StartRange   EndRange
H   10         7
H   8          8
H   6          20   

第一个表中的数据每30分钟通过一个SSIS包加载。

现在,我想要在Wariance列中的数据落入StartRange和EndRange时触发的电子邮件中发出警报。

CREATE PROCEDURE [dbo].[SP_Email] @Start varchar(50),@End varchar(50),@Date datetime
AS
BEGIN
DECLARE @xml NVARCHAR(MAX)
DECLARE @body NVARCHAR(MAX)

SET @xml = CAST(( SELECT [SlNo] AS 'td','',[date] AS 'td','',
   [lag] AS 'td','', Percent AS 'td'
FROM  TestTbl 
WHERE(percent >= @Start AND percent < @End)
AND CAST(CONVERT(VARCHAR,curDate,106) AS DATETIME) = CAST(@Date AS DATETIME)
ORDER BY SlNo 
FOR XML PATH('tr'), ELEMENTS ) AS NVARCHAR(MAX))

SET @body ='<html><body><H3>Report</H3>
<table border = 1> 
<tr>
<th> SlNo </th> <th> date </th> <th> lag </th> <th> Percent </th></tr>'    

SET @body = @body + @xml +'</table></body></html>'

EXEC msdb.dbo.sp_send_dbmail
@profile_name = 'Alert', 
@body = @body,
@body_format ='HTML',
@recipients = 'abc@gmail.com'
@subject = 'Report';
END

请建议一个有助于我在SQL Server 2005中设置此过程的过程。

先谢谢

2 个答案:

答案 0 :(得分:1)

这可以通过SQL Server Agent jobs

完成
EXEC dbo.sp_add_job
    @job_name = N'Variance Check',
    @notify_email_operator_name='you@your.domain',
    @notify_level_email=2; -- Only notify you when YourStoredProceedure fails
GO
EXEC sp_add_jobstep
    @job_name = N'Variance Check',
    @step_name = N'Check the variance',
    @subsystem = N'TSQL',
    @command = N'EXEC YourStoredProceedure', 
    @retry_attempts = 1,
    @retry_interval = 5 ;
GO
EXEC dbo.sp_add_schedule
    @schedule_name = N'EveryThirtyMinutes',
    @freq_type = 4, -- Daily
    @freq_subday_type = 0x4, -- Minutes
    @freq_subday_interval = 30, 
    @active_start_time = NULL; -- Start right away
USE msdb ;
GO
EXEC sp_attach_schedule
   @job_name = N'Variance Check',
   @schedule_name = N'EveryThirtyMinutes';
GO
EXEC dbo.sp_add_jobserver
    @job_name = N'Variance Check';
GO

答案 1 :(得分:1)

解决这个问题的一种方法是通过触发器。但是,我不建议通过触发器发送电子邮件。

而是向在T1中加载数据的进程添加一个步骤。完成此步骤后,调用存储过程以查找符合条件的行并发送相应的电子邮件。

然而,很难准确说出条件是什么。你的第二张桌有三个范围。目前尚不清楚哪一行适用于哪一行。