2016-01-22 2 views
1

Мне нужен запрос, который COUNT выполняет все строки (с условием WHERE) во всех таблицах в базе данных, где неизвестны имена table_names. Причина, почему: У меня есть «alarm_logging_system», которая каждый месяц создает новую таблицу «архив» и автоматически называет ее «AlarmLog (временная метка последнего активного аварийного сигнала)»SQL-COUNT все строки с условием WHERE во всех таблицах в базе данных

Так что мне нужен запрос, который динамически ищет через все таблицы, которые существуют в базе данных, СЧИТАЕТ всю строку в столбце с условием WHERE и возвращает одно единственное значение.

В примере я хочу получить все активные аварийные сигналы, в этом месяце, в прошлом месяце и т. Д. Или определенный временной диапазон.

Это пример запроса я написал, чтобы получить количество для всех активных сигналов тревоги в прошлом месяце

SELECT COUNT(ConditionActive) 
FROM (whole database)??? 
WHERE (Acked=0 AND ConditionActive = 1) 
AND (EventTime >= DATEADD(m,-1,DATEADD(mm, DATEDIFF(m,0,GETDATE()), 0)) 
AND [EventTime] <= DATEADD(d,-1,DATEADD(mm, DATEDIFF(m,0,GETDATE()),0)))) 
AS ACTIVE_LAST_MONTH 

Так что мне нужно, это запрос, stored_procedure или динамический запрос SQL?

Все таблицы имеют одинаковые схемы и столбцы.

Цените всю помощь!

+2

Каждая таблица во всей базе данных имеет одинаковую структуру? Это звучит невероятно плохо. Вам понадобится использовать динамический sql для такого рода вещей. –

+0

В базе данных будильника все таблицы одинаковы. Система работает следующим образом: все тревоги регистрируются в «настоящую» таблицу, которая содержит записи за последние 7 дней. Когда день продолжается, «старые» записи (последние 7 дней) вставляются в таблицу «Архивирование», которая содержит записи за месяц и т. Д., В общей сложности 24 таблицы. Почему это проблема, что все таблицы одинаковы? –

+1

Большинство баз данных - это больше, чем коллекция для одного фрагмента данных. Вы можете подумать о разметке вместо десятков и десятков одной и той же таблицы снова и снова. –

ответ

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, которые означают месяц. Как правило, это лучший подход, чтобы просто изложить это слово, чтобы устранить любую двусмысленность.

Смежные вопросы