我需要在数据库的所有表中COUNT所有行(带有WHERE条件)的查询,其中table_names是未知的。 原因是:我有一个“alarm_logging_system”,每个月左右创建一个新的“归档”表,并自动将其命名为“AlarmLog(上次活动报警的时间戳)”
所以我需要一个动态搜索数据库中存在的所有表的查询,查询具有WHERE条件的列中的所有行,并返回一个单值。
在示例中,我希望获得所有活动警报,本月,上个月等。或特定时间范围。
这是我上个月为了获取所有活动警报的计数而编写的查询示例
NSArray * myArray = [NSArray arrayWithObjects:@"a",@"b",@"c",nil];
NSString ** myStrings = ??? // an array of NSString*
那么我需要的是查询,stored_procedure还是动态SQL查询?
所有表都具有相同的架构和列。
感谢所有帮助!
答案 0 :(得分:1)
这应该说明为什么通常不认为制作同一个表的多个副本然后从整个集合中汇总一些数据是一个好习惯。这并不是关系数据库的设计工作方式。
这是未经测试的,因为我没有任何地方可以使用您的桌子,但这应该得到它。
declare @SQL nvarchar(max) = ''
--This get a result set of the count for all tables.
select @SQL = @SQL + 'select count(ConditionActive) as MyCount
from [' + t.name + ']
where Acked = 0
AND ConditionActive = 1
AND EventTime >= DATEADD(month, -1, DATEADD(month, DATEDIFF(month, 0, GETDATE()), 0))
and [EventTime] <= DATEADD(day, -1, DATEADD(month, DATEDIFF(month, 0, GETDATE()),0)) UNION ALL'
from sys.tables t
--Now we need the sum of all counts
select @SQL = 'Select sum(MyCount) from (' + LEFT(@SQL, LEN(@SQL) - 10) + ') as x'
select @SQL
--uncomment the line below when you are confident that the dynamic sql is correct.
--exec sp_executesql @SQL
- EDIT-- 我冒昧地扩展了DATEADD函数中的快捷方式。快捷方式很难记住,你使用mm和m都表示月份。这通常是一个更好的方法来拼出单词以消除任何歧义。