whe*_*ike 6 sql-server sql-server-2008-r2
我在一个实例中有几个具有相同架构/表结构的相同数据库。我需要找到他们都有的一张桌子的大小。例如,我在一个实例上有 30 个数据库,所有数据库都有一个“个人信息”表。我需要找到一种方法来查询他们都拥有的“个人信息”表的大小,而不是单独访问每个数据库。
有没有办法做到这一点?
类似于 SP_Spaceused 用于大小“数据列”
DECLARE @table SYSNAME = N'Personal Information',
@schema SYSNAME = N'dbo';
CREATE TABLE #sz
(
dbname NVARCHAR(255),
fullname NVARCHAR(768), [rows] SYSNAME,
reserved SYSNAME, [data] SYSNAME,
index_size SYSNAME, unused SYSNAME
);
DECLARE @sql NVARCHAR(MAX) = N'DECLARE @t NVARCHAR(512);';
SELECT @sql += N'IF EXISTS (SELECT 1 FROM ' + QUOTENAME(name)
+ N'.sys.tables AS t INNER JOIN ' + QUOTENAME(name)
+ N'.sys.schemas AS s ON t.[schema_id] = s.[schema_id]
WHERE t.name = @table AND s.name = @schema)
BEGIN
SET @t = N''' + QUOTENAME(name) + N'.'' + QUOTENAME(@schema)
+ N''.'' + QUOTENAME(@table); INSERT #sz(fullname, [rows],
reserved, [data], index_size, unused) EXEC '
+ QUOTENAME(name) + N'.sys.sp_spaceused @t; UPDATE #sz
SET dbname = N''' + name + N''' WHERE dbname IS NULL;
END '
FROM sys.databases
WHERE database_id > 4 AND [state] = 0 AND is_read_only = 0;
EXEC sys.sp_executesql @sql, N'@table SYSNAME, @schema SYSNAME', @table, @schema;
SELECT [database] = dbname,
[schema] = @schema, [table] = @table,
[rows], reserved, [data], index_size, unused
FROM #sz;
DROP TABLE #sz;
Run Code Online (Sandbox Code Playgroud)