Sql server 从SQL Server中的所有数据库获取表大小信息

Sql server 从SQL Server中的所有数据库获取表大小信息,sql-server,tsql,sql-server-2012,Sql Server,Tsql,Sql Server 2012,我有这个脚本,它将为特定数据库提供表大小 我的问题是如何重写代码,以便它可以从SQL Server返回所有表大小信息,而不管数据库是什么,这意味着我不需要更改use\u db [use_db] SELECT t.name AS TableName, p.rows AS RowCounts, SUM(a.total_pages) * 8 AS TotalSpaceKB, SUM(a.used_pages) * 8 AS UsedSpaceKB,

我有这个脚本,它将为特定数据库提供表大小

我的问题是如何重写代码,以便它可以从SQL Server返回所有表大小信息,而不管数据库是什么,这意味着我不需要更改
use\u db

[use_db]
SELECT t.name AS TableName,
       p.rows AS RowCounts,
       SUM(a.total_pages) * 8 AS TotalSpaceKB,
       SUM(a.used_pages) * 8 AS UsedSpaceKB,
       (SUM(a.total_pages) - SUM(a.used_pages)) * 8 AS UnusedSpaceKB
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 t.is_ms_shipped = 0
    AND i.object_id > 255
GROUP BY t.name,
         p.rows
ORDER BY t.name
输出-

db_name                    obj_name                           total_rows  total_space   used_space   unused_space
-------------------------- ---------------------------------- ----------- ------------- ------------ --------------
master                     dbo.Person                         1000        0.20          0.13         0.08
master                     dbo.Building                       4           0.03          0.03         0.00
ReportServer$SQL_2012      dbo.Keys                           1           0.02          0.02         0.00
ReportServer$SQL_2012      dbo.History                        0           0.00          0.00         0.00
ReportServer$SQL_2012      dbo.ConfigurationInfo              20          0.03          0.03         0.00
ReportServer$SQL_2012      dbo.Catalog                        1           0.08          0.08         0.00
ReportServer$SQL_2012      dbo.UpgradeInfo                    1           0.02          0.02         0.00
输出-

db_name                    obj_name                           total_rows  total_space   used_space   unused_space
-------------------------- ---------------------------------- ----------- ------------- ------------ --------------
master                     dbo.Person                         1000        0.20          0.13         0.08
master                     dbo.Building                       4           0.03          0.03         0.00
ReportServer$SQL_2012      dbo.Keys                           1           0.02          0.02         0.00
ReportServer$SQL_2012      dbo.History                        0           0.00          0.00         0.00
ReportServer$SQL_2012      dbo.ConfigurationInfo              20          0.03          0.03         0.00
ReportServer$SQL_2012      dbo.Catalog                        1           0.08          0.08         0.00
ReportServer$SQL_2012      dbo.UpgradeInfo                    1           0.02          0.02         0.00

有几种方法可以做到这一点。您可以使用未记录的SQL Server过程msForEachDb。它对当前实例上的每个db执行传递的SQL语句。问号将替换为当前数据库名称

对于每个Db示例

/* Undocumented sp can loop over every db on the server.
 */
EXECUTE msdb..sp_msForEachDb
    '
        USE [?];

        SELECT DB_NAME();
    '
;
这种方法的问题在于它没有文档记录。这意味着MS可以随时撤回或更改SP

另一种可能更安全的方法是查询系统目录。您可以使用它们来构建可以执行的动态SQL语句

系统目录示例

/* Using system tables to obtain and query each db,
 * via dynamic SQL statement.
 */
DECLARE @query NVARCHAR(MAX)  = '';

SELECT
    @query = @query + 'USE [' + Name + ']; SELECT DB_NAME();'
FROM
    sys.databases
;

EXECUTE sp_ExecuteSql @query;
;

您也可以在SSI中或使用循环或来实现相同的结果。

有几种方法可以做到这一点。您可以使用未记录的SQL Server过程msForEachDb。它对当前实例上的每个db执行传递的SQL语句。问号将替换为当前数据库名称

对于每个Db示例

/* Undocumented sp can loop over every db on the server.
 */
EXECUTE msdb..sp_msForEachDb
    '
        USE [?];

        SELECT DB_NAME();
    '
;
这种方法的问题在于它没有文档记录。这意味着MS可以随时撤回或更改SP

另一种可能更安全的方法是查询系统目录。您可以使用它们来构建可以执行的动态SQL语句

系统目录示例

/* Using system tables to obtain and query each db,
 * via dynamic SQL statement.
 */
DECLARE @query NVARCHAR(MAX)  = '';

SELECT
    @query = @query + 'USE [' + Name + ']; SELECT DB_NAME();'
FROM
    sys.databases
;

EXECUTE sp_ExecuteSql @query;
;

您也可以在SSI中或使用循环或。您好,这是否将以MB为单位返回结果?total_space=CAST(total_pages*8./1024为十进制(18,2))hi,这是否将返回以MB为单位的结果?总页数=CAST(总页数*8./1024为十进制(18,2))