20.05.2013, 18:02 | #1 |
Участник
|
Подсчет записей в ax2012 с учетом DataArea и Partition. Как лучше?
Работаю с демоданными. В том числе выполнил анализ числа записей с учетом раздела и компании.
Получился вот 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 |
|