2013-04-27 54 views
4

我試圖執行此查詢,但我不斷收到錯誤消息我的右括號拋出錯誤

Msg 102, Level 15, State1 
Incorrect syntax near ')'. 

請你看在我的查詢?我相信每個SQL關鍵字都添加了相應的括號。

USE [db] 
GO 

SET NOCOUNT ON 

DECLARE @AlertDateTime date 
     , @HostName varchar(50) 
     , @Program varchar(100) 
     , @Event varchar(100) 
     , @Entity varchar(50) 
     , @Class tinyint 
     , @Severity tinyint 
     , @AlertMessage varchar(1024) 
     , @SkipFlag char(1) 

select cast(getdate() as date) 

IF EXISTS 

(SELECT * FROM SendAlertLog 

WHERE EXISTS 
(
    SELECT SendAlertLog.Event 
    FROM SendAlertLog 
    GROUP BY SendAlertLog.Event 
    HAVING COUNT (1) >= 2 
) 
AND SendAlertLog.SkipFlag != 'Y' 
AND AlertDateTime <= DATEADD (mi,-30,@AlertDateTime) 
) 

我不知道我在包括或排除錯誤。請幫忙

+2

做你錯過了開始...結束 – Satya 2013-04-27 04:40:26

+0

謝謝薩蒂亞,使用BEGIN END工作! – user2325964 2013-04-27 04:59:29

回答

3

看起來你有一個if,但如果表達式是真的,沒有聲明。你有

IF EXISTS(...) 

但你需要

IF EXISTS(...) 
    DO_SOMETHING 
+0

謝謝! mhasan和user12861。我刪除了IF EXISTS並用BEGIN END替換。 – user2325964 2013-04-27 04:49:48

2

試試這個(不SendAlertLog的雙重用途) -

DECLARE @AlertDateTime DATE 

IF EXISTS (
    SELECT 1 
    FROM (
     SELECT 
       cnt = COUNT(1) 
      , SkipFlag = MAX(l.SkipFlag) 
      , AlertDateTime = MAX(l.AlertDateTime) 
     FROM dbo.SendAlertLog l 
     GROUP BY l.[Event] 
    ) l 
    WHERE cnt >= 2 
     AND l.SkipFlag != 'Y' 
     AND l.AlertDateTime <= DATEADD(mi, -30, @AlertDateTime) 
) BEGIN 

    PRINT 'Do something' 

END 
+0

謝謝但是聚合可能不會出現在WHERE子句中,除非它位於包含在HAVING子句或選擇列表中的子查詢中,並且聚合的列是外部引用:(我對數據庫域非常陌生。 – user2325964 2013-04-27 07:21:52

+1

對不起,有一點小錯誤,請嘗試更新回答。 – Devart 2013-04-27 07:27:17

+0

這是消除查詢寫入冗餘並用IF語句控制輸出視圖的好方法。 – user2325964 2013-04-27 07:58:22