2012-11-14 34 views
0

我有一張表,它記錄了我們的應用程序中的某個應用程序的警報,如下所示,然後我們報告這些情況。然而,有時候,可能會出現一些警報或一組由於某種原因我們想要忽略的警報,例如正在進行測試,或者有人忘記在此期間關閉警報。WHERE子句的「覆蓋」配置表

我想創建一個配置表,它具有ChartId,StartTime和EndTime以及Active位(即使用此規則或不)。

下面的腳本大部分工作,除非在給定ChartId的@ReportAlarmOverride表中有多行...假設我們要忽略來自ChartId = 1的下午2:00 - 下午3:00的警報然後再從下午4點到5點。

DECLARE @ReportAlarmOverride TABLE 
(
ReportAlarmOverrideId INT IDENTITY(1,1), 
ChartId INT, 
Active BIT, 
StartTime DATETIME, 
EndTime DATETIME, 
LastModifiedTime DATETIME DEFAULT GETDATE() 
) 
INSERT INTO @ReportAlarmOverride 
SELECT 1, 1, GETDATE() - 1, NULL, NULL UNION 
SELECT 3, 1, GETDATE() - 1, GETDATE(), NULL UNION 
SELECT 5, 1, GETDATE() - 3, NULL, NULL UNION 
SELECT 7, 1, GETDATE() - 1, NULL, GETDATE() --UNION 
--SELECT 3, 1, '2012-11-12 16:09:20', '2012-11-12 16:09:21', NULL --Adding this row makes SELECT below stop working 

SELECT Alarm.AlarmTime, AlarmOverride.StartTime, AlarmOverride.EndTime, * 
FROM dbo.AlarmLogSummary Alarm 
JOIN dbo.AlarmConfiguration AlarmConfig ON Alarm.AlarmConfigurationId = AlarmConfig.AlarmConfigurationId 
LEFT JOIN @ReportAlarmOverride AlarmOverride ON AlarmConfig.ChartId = AlarmOverride.ChartId 
WHERE Alarm.AlarmTime > GETDATE() - 2 
AND ((AlarmOverride.Active = 1 AND Alarm.AlarmTime NOT BETWEEN AlarmOverride.StartTime AND ISNULL(AlarmOverride.EndTime, GETDATE())) 
OR Active = 0) 

回答

3

而是加入@ReportAlarmOverride表,嘗試把這個邏輯在WHERE子句中,如下所示:

DECLARE @ReportAlarmOverride TABLE 
(
ReportAlarmOverrideId INT IDENTITY(1,1), 
ChartId INT, 
Active BIT, 
StartTime DATETIME, 
EndTime DATETIME, 
LastModifiedTime DATETIME DEFAULT GETDATE() 
) 
INSERT INTO @ReportAlarmOverride 
SELECT 1, 1, GETDATE() - 1, NULL, NULL UNION 
SELECT 3, 1, GETDATE() - 1, GETDATE(), NULL UNION 
SELECT 5, 1, GETDATE() - 3, NULL, NULL UNION 
SELECT 7, 1, GETDATE() - 1, NULL, GETDATE() --UNION 
--SELECT 3, 1, '2012-11-12 16:09:20', '2012-11-12 16:09:21', NULL --Adding this row makes SELECT below stop working 

SELECT Alarm.AlarmTime, * 
FROM dbo.AlarmLogSummary Alarm 
    JOIN dbo.AlarmConfiguration AlarmConfig ON Alarm.AlarmConfigurationId = AlarmConfig.AlarmConfigurationId 
WHERE Alarm.AlarmTime > GETDATE() - 2 
    AND NOT EXISTS(SELECT 1 FROM @ReportAlarmOverride Override 
        WHERE Override.ChartId = AlarmConfig.ChartId 
         AND Override.Active = 1 
         AND Alarm.AlarmTime BETWEEN Override.StartTime AND ISNULL(Override.EndTime, GETDATE()) 

唯一的問題是,你將無法退回重寫數據查詢。我希望這不是必需的。