2013-04-02 54 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

(0,1)中的where子句indid中的一个简短问题是什么意思? – palum

+0

Indid 0 =堆,indid 1 =聚簇索引。计算任何其他指数没有意义。 –