Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 根据范围自动选择值并触发电子邮件_Sql_Sql Server_Tsql_Triggers_Jobs - Fatal编程技术网

Sql 根据范围自动选择值并触发电子邮件

Sql 根据范围自动选择值并触发电子邮件,sql,sql-server,tsql,triggers,jobs,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包加载一次 现在,我希望在差异列中的数据位于起始范

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

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包加载一次

现在,我希望在差异列中的数据位于起始范围和结束范围时触发电子邮件中的警报

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
请建议一个过程,帮助我在SQLServer2005中设置这样的程序

提前感谢

这可以通过以下方式完成:


实现这一点的一种方法是通过触发器。但是,我不建议通过触发器发送电子邮件

相反,在加载T1中数据的过程中添加一个步骤。在此步骤之后,调用一个存储过程,该存储过程查找满足条件的行并发送相应的电子邮件


然而,很难说清楚具体情况是什么。您的第二张桌子有三个范围。不清楚哪一行应用于哪一行。

只有startrange和endrange下的值才能与方差一起考虑column@Gallop . . . 在您的示例中,表中有三个值。这三个值都被使用了吗?嗨,Gordon-我开发了一个SSIS包,可以每半小时将数据加载到数据库表中。问题中仅使用两个可用值。此外,已按照您的建议开发了SP,并在问题中进行了更新。但是,我如何每小时自动检查数据库表,以及如果值在范围内,如何触发电子邮件警报?谢谢你Advance@Gallop . . . 我会使用SQL Server代理中的作业安排这样的任务,并让它每小时运行一次。选择[SlNo]作为'td',[date]作为'td',[lag]作为'td',从TestTbl中选择%s作为'td',其中%s>=@Start和%s<@End和CASTCONVERTVARCHAR,curDate,106作为DATETIME=CAST@Date作为DATETIME-我还想检查条件中的任何列
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