Работаю с демоданными. В том числе выполнил
анализ числа записей с учетом раздела и компании.
Получился вот SQL-скрипт, который привел ниже.
Уверен, что скрипт можно улучшить
Например, хочется, чтобы он выполнялся в один проход (хотя и не уверен, что это будет быстрее и эффективнее)
Также хочется, чтобы можно было задать фильтр по именам таблиц (пока не придумал, как его включить по человечески)
Как можно улучшить этот скрипт?
Код:
--
-- Подсчитывает число записей в базе данных Dynamics AX 2012 в разрезе Partition, DataArea
-- версия 1.0, mazzy
--
-- Фильтр на названия таблиц (в текущей версии не используется)
DECLARE @filter NVARCHAR(255)
-- Варианты фильтров:
-- SET @filter = '' -- по умолчанию считать число записей во всех таблицах.
-- SET @filter = 'and o.name like ''a%'''
-- SET @filter = 'and o.name like ''%retail%'''
-- SET @filter = 'and o.name like ''%trans%'''
-- добавляем пробел, чтобы можно было подключать и другие условия
IF( LEN(@filter) > 0 and RIGHT(@filter,1) <> ' ')
set @filter += ' '
-- временная таблица, для хранения результатов
DECLARE @tblTemp TABLE(NAME nvarchar(255), Row_Count int, PARTITION nvarchar(255), DATAAREA nvarchar(255))
INSERT INTO @tblTemp
EXEC sp_msforeachtable
@command1 = 'SELECT ''?'', COUNT(0), PARTITIONS.NAME, DATAAREAID
FROM ? JOIN PARTITIONS on (PARTITIONS.RECID = ?.PARTITION)
group by PARTITIONS.NAME, DATAAREAID',
@whereand = 'and 0 <> (select count(*) from sys.columns as c where c.object_id = o.id and c.name = ''DATAAREAID'')
and 0 <> (select count(*) from sys.columns as c where c.object_id = o.id and c.name = ''PARTITION'')'
INSERT INTO @tblTemp
EXEC sp_msforeachtable
@command1 = 'SELECT ''?'', COUNT(0), PARTITIONS.NAME, NULL
FROM ? JOIN PARTITIONS on (PARTITIONS.RECID = ?.PARTITION)
group by PARTITIONS.NAME',
@whereand = 'and 0 = (select count(*) from sys.columns as c where c.object_id = o.id and c.name = ''DATAAREAID'')
and 0 <> (select count(*) from sys.columns as c where c.object_id = o.id and c.name = ''PARTITION'')'
INSERT INTO @tblTemp
EXEC sp_msforeachtable
@command1 = 'SELECT ''?'', COUNT(0), NULL, DATAAREAID
FROM ?
group by DATAAREAID',
@whereand = 'and 0 <> (select count(*) from sys.columns as c where c.object_id = o.id and c.name = ''DATAAREAID'')
and 0 = (select count(*) from sys.columns as c where c.object_id = o.id and c.name = ''PARTITION'')'
INSERT INTO @tblTemp
EXEC sp_msforeachtable
@command1 = 'SELECT ''?'', COUNT(0), NULL, NULL
FROM ?',
@whereand = 'and 0 = (select count(*) from sys.columns as c where c.object_id = o.id and c.name = ''DATAAREAID'')
and 0 = (select count(*) from sys.columns as c where c.object_id = o.id and c.name = ''PARTITION'')'
SELECT * FROM @tblTemp