2013-04-02 4 views
0

У меня есть сценарий, где мне нужно сравнить данные между двумя серверами.получить все имена таблиц с номером строки первичного ключа

Короче говоря, мне нужен результирующий набор, который дает выход как

SchemaName|TableName|RowCount_PrimaryKey 

Всякий раз, когда новый студент соединяет уникальную схему создается сказать Stu1200 и эта схема имеет 5 таблиц, как

stu1200.class 
stu1200.sub 
stu1200.avg 
stu1200.work 
stu1200.blabla 

В нашей базе данных 500 студентов. Так 500 схем. Мне нужно сравнить все таблицы работы 500 студентов.

Для этого мне нужно получить подсчеты первичного ключа, скажем StuID. Поэтому мне нужно получить все 500 схем с таблицей, как работа.

Что-то вроде

SchemaName TableName StuID_Count 
stu1200  Work   70 
Stu1201  Work   112 
Stu1202  Work   9 

Как это можно сделать? У меня есть скрипт, который подсчитывает количество строк таблицы, но бесполезен, мне нужны подсчет строк, основанный только на первичном ключе.

. Примечание: с помощью SQL Server 2000 :(

Заранее спасибо за обмен ваши предложения/опыт

+1

Вы создаете новую схему для каждого ученика? Хлоп. –

+0

Подождите, как вы создаете схемы в SQL Server 2000? Вы имели в виду нового владельца? –

+0

Да, это новый владелец – palum

ответ

1

Ваш дизайн весьма сомнительна, но вот способ получить счет относительно уточненный эффективным способом в SQL Server 2005+:.

DECLARE @tablename SYSNAME; 
SET @tablename = N'Work'; 

SELECT 
    SchemaName = OBJECT_SCHEMA_NAME([object_id]), 
    TableName = @tablename, 
    RowCount_PrimaryKey = SUM([rows]) 
FROM sys.partitions 
    WHERE OBJECT_NAME([object_id]) = @tablename 
    AND index_id IN (0,1) 
    GROUP BY OBJECT_SCHEMA_NAME([object_id]) 
    ORDER BY SchemaName; 

Просто заметил SQL Server 2000.

DECLARE @tablename SYSNAME; 
SET @tablename = N'Work'; 

SELECT 
    SchemaName = u.name, 
    TableName = @tablename, 
    i.rows 
FROM 
    sys.sysindexes AS i 
INNER JOIN sys.sysobjects AS o 
    ON i.id = o.id 
INNER JOIN sys.sysusers AS u 
    ON o.uid = u.uid 
    WHERE i.indid IN (0,1) 
    AND o.name = @tablename; 
+0

Быстрый вопрос в разделе where indid in (0,1), что это значит? – palum

+0

Indid 0 = heap, indid 1 = сгруппированный индекс. Нет никакого смысла считать любой другой индекс. –

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