我一直盯着这个在存储过程中运行的查询变得更加困惑。
我有一张看起来像这样的桌子......
AsofDate Database_Name Mirroring_Sate
DateTime Database1 Synchronized
DateTime Database2 Suspended
DateTime Database3 Disconnected
DateTime Database1 Synchronized
DateTime Database2 Synchronized
DateTime Database3 Disconnected
DateTime Database1 Synchronized
DateTime Database2 Synchronized
DateTime Database3 Disconnected
所以我有一个运行的作业,并在此表中记录每15分钟3个数据库的镜像状态。如果镜像状态不等于Synchronized,我需要一个查询,对于任何一个数据库名称进行3次连续检查。
因此,如果例如Database1在下午3点,然后在下午3点15分,那么在下午3点30分处于断开状态,这是我需要知道的。我现在正在做的是查看整个表格,如果在一个非同步状态的任何一个数据库的计数是3或更多,那么我正在服用一个不太我想要的acion。我只想在最后3次检查中这样做,就是这样。
这是我的查询。
IF EXISTS (SELECT 1
FROM dbo.U_MirroringStatus WITH (NOLOCK)
where mirroring_state_desc <> 'SYNCHRONIZED'
GROUP BY database_name
HAVING COUNT(*) >= @MirroringStatusViolationCountForAlert
)
任何帮助/建议都会很棒。 提前谢谢。
答案 0 :(得分:1)
也许这样的事情可以满足您的需求:
IF EXISTS (SELECT 1
FROM (SELECT TOP 3 ms.*
FROM dbo.U_MirroringStatus WITH (NOLOCK)
WHERE database_name = @DatabaseName
ORDER BY AsOfDate DESC
) ms
WHERE mirroring_state_desc <> 'SYNCHRONIZED'
HAVING COUNT(*) >= @MirroringStatusViolationCountForAlert
)
在文中,您为单个数据库指定了这个,这就是我添加where
的原因。
答案 1 :(得分:1)
select Database_Name
from ( select AsofDate, Database_Name, Mirroring_Sate
ROW_NUMBER ( ) Over (partition by Database_Name order by AsofDate desc) as row
) as xx
where Mirroring_Sate <> 'SYNCHRONIZED'
and row <= 3
group by Database_Name
having count(*) = 3