Sql 如何对数据库中的每个表进行返回(行计数、表名)的查询?

Sql 如何对数据库中的每个表进行返回(行计数、表名)的查询?,sql,Sql,使用ansisql,我如何进行查询 返回每个 数据库中的表 谢谢 Viki在“ANSI”(ISO)SQL中,您必须转到信息模式视图以获取信息。官方说法是ISO/IEC 9075-11:2003(或2008)。另请参见维基百科关于的文章,其中写道: SQL/模式或信息和定义模式部分由ISO/IEC 9075第11部分定义。SQL/Schemata定义了信息模式和定义模式,提供了一组通用的工具来实现SQL数据库和对象的自描述。这些工具包括SQL对象标识符、结构和完整性约束、安全和授权规范、ISO/I

使用ansisql,我如何进行查询 返回每个 数据库中的表

谢谢
Viki

在“ANSI”(ISO)SQL中,您必须转到信息模式视图以获取信息。官方说法是ISO/IEC 9075-11:2003(或2008)。另请参见维基百科关于的文章,其中写道:

SQL/模式或信息和定义模式部分由ISO/IEC 9075第11部分定义。SQL/Schemata定义了信息模式和定义模式,提供了一组通用的工具来实现SQL数据库和对象的自描述。这些工具包括SQL对象标识符、结构和完整性约束、安全和授权规范、ISO/IEC 9075的功能和包、对基于SQL的DBMS实现提供的功能的支持、基于SQL的DBMS实现信息和大小调整项,以及DBMS实现支持的值。本部分标准包含强制性和可选功能

以“强制性功能”为例——我怀疑大多数DBMS甚至没有实现强制性部分

否则,答案是非常特定于DBMS的。信息是可用的-细节因DBMS而异,仅此而已


SQL/Schemata(2003版)的第5.61节定义了“表视图”。它似乎不包含行计数,我可以看到的任何其他视图也不包含行计数。因此,Beau Simensen的评论似乎是正确的;没有简单的方法可以方便地找到行计数

CREATE VIEW TABLES AS
    SELECT TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME,
           TABLE_TYPE, SELF_REFERENCING_COLUMN_NAME, REFERENCE_GENERATION,
           USER_DEFINED_TYPE_CATALOG, USER_DEFINED_TYPE_SCHEMA,
           USER_DEFINED_TYPE_NAME, IS_INSERTABLE_INTO, IS_TYPED,
           COMMIT_ACTION
FROM DEFINITION_SCHEMA.TABLES
WHERE ( TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME ) IN
      ( SELECT TP.TABLE_CATALOG, TP.TABLE_SCHEMA, TP.TABLE_NAME
        FROM DEFINITION_SCHEMA.TABLE_PRIVILEGES AS TP
        WHERE ( TP.GRANTEE IN ( 'PUBLIC', CURRENT_USER )
                OR GRANTEE IN ( SELECT ROLE_NAMEFROM ENABLED_ROLES ) )
        UNION
        SELECT CP.TABLE_CATALOG, CP.TABLE_SCHEMA, CP.TABLE_NAME
        FROM DEFINITION_SCHEMA.COLUMN_PRIVILEGES AS CP
        WHERE ( CP.GRANTEE IN ( 'PUBLIC', CURRENT_USER )
                OR CP.GRANTEE IN ( SELECT ROLE_NAME
                                   FROM ENABLED_ROLES ) ) )
   AND TABLE_CATALOG = ( SELECT CATALOG_NAME
                         FROM INFORMATION_SCHEMA_CATALOG_NAME );
从选择列表中可以看到,不包括行计数


因此,我认为没有可移植的方法来确定行数和表名。

最好的方法是编写一个过程,从数据库的元数据(Oracle-all_tables,MySql-information_schema.tables)中提取信息,然后运行计数查询。

我认为您无法找到一种在所有系统上都能工作的方法,因为那些“目录视图”或系统视图(或任何它们被称为)通常是特定于供应商的

例如,对于SQL Server,您可以使用此查询进入“sys”模式,该模式包含所有系统视图(SQL Server 2005及以上版本):

选择
t、 名称为TableName,
i、 名称为indexName,
p、 [行],
合计(总页数)为总页数,
作为已用页面的总和(a.已用页面),
作为数据页的总和(a.数据页),
(总页数)*8)/1024总计为MB,
(总计(使用的页数)*8)/1024作为使用的空间MB,
(总计(a.数据页)*8)/1024作为数据空间MB
从…起
系统表t
内连接
t.OBJECT\u ID=i.OBJECT\u ID上的sys.index i
内连接
i.object\u id=p.object\u id和i.index\u id=p.index\u id上的sys.p分区
内连接
p.partition\u id=a.container\u id上的sys.allocation\u units a
哪里
t、 名称不象“dt%”和
i、 对象ID>255和

i、 index_id执行此操作的语法因使用的数据库而异。这是用于哪个RDBMS的?我怀疑您是否能找到一种在所有数据库系统上以相同方式执行此操作的方法。供应商之间的系统视图差别很大……我看不出在视图的信息模式集合中在哪里可以找到这些信息(表中的行数)。似乎不存在(至少在SQLServer的信息架构实现中)
SELECT 
    t.NAME AS TableName,
    i.name as indexName,
    p.[Rows],
    sum(a.total_pages) as TotalPages, 
    sum(a.used_pages) as UsedPages, 
    sum(a.data_pages) as DataPages,
    (sum(a.total_pages) * 8) / 1024 as TotalSpaceMB, 
    (sum(a.used_pages) * 8) / 1024 as UsedSpaceMB, 
    (sum(a.data_pages) * 8) / 1024 as DataSpaceMB
FROM 
    sys.tables t
INNER JOIN      
    sys.indexes i ON t.OBJECT_ID = i.object_id
INNER JOIN 
    sys.partitions p ON i.object_id = p.OBJECT_ID AND i.index_id = p.index_id
INNER JOIN 
    sys.allocation_units a ON p.partition_id = a.container_id
WHERE 
    t.NAME NOT LIKE 'dt%' AND
    i.OBJECT_ID > 255 AND   
    i.index_id <= 1
GROUP BY 
    t.NAME, i.object_id, i.index_id, i.name, p.[Rows]
ORDER BY 
    object_name(i.object_id)