Comments 11
Думаю, статья и так достаточно большая, увеличивать ее еще — это значит делать абсолютно нечитабельной. Лучше найти полезные статьи про статистики на английском, и также их перевести. Про некоторые статистики статью переводил я — посмотрите, может быть, будет интересно.
Намного удобнее использовать T-SQL для генерирования скрипта. Скрипт, приведённый ниже, сгенерирует набор инструкций T-SQL для получения количества строк в каждой таблице текущей базы данных. Просто выполните его, скопируйте результат в новое окно и запустите.

Намного удобнее использовать T-SQL для генерирования скрипта. Скрипт, приведённый ниже, сгенерирует набор инструкций T-SQL для получения количества строк в каждой таблице текущей базы данных. Просто выполните его, скопируйте результат в новое окно и запустите.
SELECT  'Select ''' + DB_NAME() + '.' + SCHEMA_NAME(SCHEMA_ID) + '.'
        + LEFT(o.name, 128) + ''' as DBName, count(*) as Count From ' + o.name
        + ';' AS ' Script generator to get counts for all tables'
FROM    sys.objects o
WHERE   o.[type] = 'U'
ORDER BY o.name;

GO



Почему бы не сделать так:
declare @sql nvarchar(max);
set @sql = '';

SELECT  @sql = @sql + 'Select ''' + DB_NAME() + '.' + SCHEMA_NAME(SCHEMA_ID) + '.'
        + LEFT(o.name, 128) + ''' as DBName, count(*) as Count From ' + SCHEMA_NAME(SCHEMA_ID) + '.' + o.name
        + ';' + char(13) + char(10)
FROM    sys.objects o
WHERE   o.[type] = 'U'
ORDER BY o.name;

exec (@sql)
GO


Примечание переводчика: у меня запрос не работал, добавил схему к имени таблицы.

Совершенно верно, запрос сработает только для объектов внутри схемы по-умолчанию — dbo, или внутри схемы текущего пользователя. Для других схем их имя надо указать явно. Более того, все имена объектов нужно заключать в квадратные скобки — я могу создать таблицу с именем ORDER, но выбрать из нее таким запросом: «select * from order» я ничего не смогу, надо писать так: «select * from [order]».

Примечание переводчика: курсор не отработает, если у вас в списке есть базы данных с состоянием, отличным от ONLINE.


Нужно всего лишь поправить запрос для курсора:

SELECT  *
    FROM    sys.databases
    WHERE    Name NOT IN ( 'master', 'model', 'msdb', 'tempdb',
                            'distribution' )
                            and state_desc = 'ONLINE'
    ORDER BY Name; 


Ну и еще вагон и маленькая тележка замечаний к коду автора статьи, но, тем не менее, статья весьма полезна для начинающих админов БД, и перевод ее на русский тоже весьма полезен.
Почему бы не сделать так:

Я думаю автор не уделял особого внимания этому запросу. Всё-таки дальше он пишет, что лучше из метаданных брать информацию о количестве записей, а это так — для примера и сравнения сколько времени займёт. Конечно, с dynamic SQL удобнее.

Совершенно верно, запрос сработает только для объектов внутри схемы по-умолчанию — dbo, или внутри схемы текущего пользователя. Для других схем их имя надо указать явно. Более того, все имена объектов нужно заключать в квадратные скобки

Нужно всего лишь поправить запрос для курсора:

Спасибо.

Ну и еще вагон и маленькая тележка замечаний к коду автора статьи

Действительно, код не идеален. Но он рабочий (а там где возможны проблемы — я постарался описать в каких ситуациях они могут возникнуть) и, при необходимости, каждый сможет допилить его под себя без особых проблем.
Отличный перевод нужной статьи. Держать все полезные запросы под рукой всегда нужно. Спасибо.
Only those users with full accounts are able to leave comments. Log in, please.