Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Извлечение краткой информации обо всех таблицах базы  [new]
Sergey Shubnikov
Member

Откуда: Москва
Сообщений: 12
Здравствуйте, нужно создать, казалось бы, простой запрос, который бы в итоге дал следующую информацию обо всех таблицах используемой БД (MS SQL Server 2000):

Имя таблицы|Кол-во строк в таблице

Пробовал
SELECT * FROM _DBNAME_.INFORMATION_SCHEMA.TABLES

Но в итоге почти все что нужно, только нет информации о кол-ве строк.

Заранее спасибо.
27 авг 07, 11:51    [4578323]     Ответить | Цитировать Сообщить модератору
 Re: Извлечение краткой информации обо всех таблицах базы  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
ничто кроме
select count(*) from table_name
не гарантирует точное количество строк в таблице.
можете покопаться в индексах. но там статистика может устаревать.

для спящего время бодрствования равносильно сну
27 авг 07, 11:55    [4578344]     Ответить | Цитировать Сообщить модератору
 Re: Извлечение краткой информации обо всех таблицах базы  [new]
Sergey Shubnikov
Member

Откуда: Москва
Сообщений: 12
Мда... А если кол-во таблиц ОЧЕНЬ большое...
Решение конечно известное и хорошее, спасибо :) Однако не в моем случае.
Задача именно для всех таблиц сразу.

Можно, как альтернативный вариант, если это возможно, сделать запрос что то типа статистики использования таблиц (в какие таблицы наиболее часто вносится информация)...
Только вот как?
27 авг 07, 12:03    [4578408]     Ответить | Цитировать Сообщить модератору
 Re: Извлечение краткой информации обо всех таблицах базы  [new]
-=DiM@n=-
Member

Откуда: Москва
Сообщений: 1564
DECLARE @TabName  sysname;
DECLARE @RowCount int;
DECLARE @stmt     nvarchar(4000);

IF OBJECT_ID('TempDB..#t', 'U') IS NOT NULL
	DROP TABLE #t;

CREATE TABLE #t
	(
	TABLE_NAME sysname NOT NULL,
	ROW_COUNT int NOT NULL
	);

DECLARE tab_cur CURSOR STATIC FORWARD_ONLY FOR
	SELECT name 
	FROM sysobjects 
	WHERE type = 'U';

OPEN tab_cur;
FETCH NEXT FROM tab_cur INTO @TabName;

WHILE @@FETCH_STATUS = 0
BEGIN
	SET @stmt = N'
	SELECT '''+@TabName+N''', 
		   (SELECT COUNT(*) FROM '+@TabName+N')';

	INSERT INTO #t
	EXEC (@stmt);

	FETCH NEXT FROM tab_cur INTO @TabName;
END;

CLOSE tab_cur;
DEALLOCATE tab_cur;

SELECT * FROM #t;

27 авг 07, 13:04    [4578936]     Ответить | Цитировать Сообщить модератору
 Re: Извлечение краткой информации обо всех таблицах базы  [new]
Glory
Member

Откуда:
Сообщений: 104760
Sergey Shubnikov

Можно, как альтернативный вариант, если это возможно, сделать запрос что то типа статистики использования таблиц (в какие таблицы наиболее часто вносится информация)...
Только вот как?

Настраиваете трассировку(trace) и потом анализируете ее данные
27 авг 07, 13:44    [4579295]     Ответить | Цитировать Сообщить модератору
 Re: Извлечение краткой информации обо всех таблицах базы  [new]
i-shu
Member

Откуда: Moscow
Сообщений: 3
select substring(o.name, 1, 30) Table_Name ,i.rows Number_of_Rows
from sysobjects o
inner join sysindexes i
on (o.id = i.id)
where o.xtype = 'u'
and i.indid < 2
order by o.name
27 авг 07, 13:46    [4579312]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Извлечение краткой информации обо всех таблицах базы  [new]
SIMPLicity_
Member

Откуда: (((@)))
Сообщений: 8679
i-shu
select substring(o.name, 1, 30) Table_Name ,i.rows Number_of_Rows
from sysobjects o
inner join sysindexes i
on (o.id = i.id)
where o.xtype = 'u'
and i.indid < 2
order by o.name


Облазил всё и ничего больше не нашёл.
Есть ли тайное знание? (для MSSQL-2000/2005/2008)
29 дек 09, 13:24    [8132138]     Ответить | Цитировать Сообщить модератору
 Re: Извлечение краткой информации обо всех таблицах базы  [new]
senoptic
Member

Откуда:
Сообщений: 1
мне помог такой запрос, но как сказали выше, информация может быть не достаточно актуальной (статистика)

SELECT 
  o.name,
  SUM(CASE WHEN (index_id < 2) THEN row_count ELSE 0 END) AS countOfRows
FROM sys.dm_db_partition_stats s INNER JOIN sys.objects o ON s.object_id = o.object_id
WHERE o.type = 'U'
GROUP BY o.name
ORDER BY 1 DESC
6 янв 10, 22:36    [8153434]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить