Sql server 从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,
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))