【问题标题】:SQL: count and show all rows and columns of all tables under a schemeSQL:统计并显示一个scheme下所有表的所有行和列
【发布时间】:2021-07-31 17:03:54
【问题描述】:

网络上的某个地方(缺少源,可能在这里)我得到了这个 SQL 语句:

SELECT t.NAME AS TableName, SUM(a.total_pages) * 8 AS TotalSpaceKB, p.Rows 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 
LEFT OUTER JOIN sys.schemas s ON t.schema_id = s.schema_id 
WHERE t.NAME NOT LIKE 'dt%' AND t.NAME LIKE '%MY_TABLES%' AND s.Name LIKE 'MY_ACHEMA'
  AND t.is_ms_shipped = 0
  AND i.OBJECT_ID > 255
GROUP BY t.Name, p.Rows
ORDER BY p.Rows DESC

这给了我一个美丽的景色,有 3 列。像这样:

           TableName  TotalSpaceKB     Rows
               TABLE       3231656    76000
               TABLE       2305632    29136
               TABLE       2213128    14160
               TABLE       1954200     3020
etc...

现在我想扩展它以包括每个表的列数。如何做到这一点?

【问题讨论】:

  • 用您正在使用的数据库标记您的问题。

标签: sql size dimensions


【解决方案1】:

我删除了分组并使用了子查询:

SELECT
    t.NAME AS TableName,
    (SELECT SUM(a.total_pages) * 8 
        FROM sys.indexes i
        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.OBJECT_ID = i.object_id AND i.OBJECT_ID > 255
    ) AS TotalSpaceKB,
    (SELECT SUM(p.Rows)
        FROM sys.indexes i
        INNER JOIN sys.partitions p ON i.object_id = p.OBJECT_ID AND i.index_id = p.index_id 
        WHERE t.OBJECT_ID = i.object_id AND i.OBJECT_ID > 255
    ) AS Rows,
    (SELECT COUNT(*) FROM sys.columns c WHERE t.OBJECT_ID = c.object_id) AS Columns
FROM sys.tables t 
LEFT OUTER JOIN sys.schemas s ON t.schema_id = s.schema_id 
WHERE t.NAME NOT LIKE 'dt%' AND t.NAME LIKE '%MY_TABLES%' AND s.Name LIKE 'MY_ACHEMA'
  AND t.is_ms_shipped = 0
ORDER BY Rows DESC

【讨论】:

    【解决方案2】:

    通过添加INFORMATION_SCHEMA.COLUMNS,这应该对您有用。

    SELECT t.NAME AS TableName, SUM(a.total_pages) * 8 AS TotalSpaceKB, p.Rows, COUNT(COLUMN_NAME) AS ColumnCount
    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 
    LEFT JOIN sys.schemas s ON t.schema_id = s.schema_id 
    LEFT JOIN INFORMATION_SCHEMA.COLUMNS ISC ON t.NAME = ISC.TABLE_NAME 
    WHERE t.NAME NOT LIKE 'dt%' AND t.NAME LIKE '%MY_TABLES%' AND s.Name LIKE 'MY_ACHEMA'
      AND t.is_ms_shipped = 0
      AND i.OBJECT_ID > 255
    GROUP BY t.Name, p.Rows
    ORDER BY p.Rows DESC
    

    【讨论】:

    • 几乎是对的!发生了一些奇怪的事情,这使某些表的列数量增加了一倍,但对于其他表却没有!我是否也在计算两倍的行数?
    猜你喜欢
    • 2014-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多