Suj*_*Tee 2 sql-server sql-server-2012
如何对sp_spaceused
所有数据库中的所有表执行?
即如何在sp_spaceused
里面执行sp_msforeachdb
。
例如:
sp_msforeachdb 'sp_msforeachtable'sp_spaceused"?"''
Run Code Online (Sandbox Code Playgroud)
使用带有游标的动态 SQL(对于这些情况可以)
这是代码:
DECLARE @DBName varchar(200)
DECLARE @CMD varchar(max)
DECLARE @TV TABLE ( name_table varchar(500),ROWSCOUNT int, reserveder varchar(50), datasize varchar(50), indexsize varchar(50), unused varchar(50))
DECLARE @TV2 TABLE ( DBName varchar(200),name_table varchar(500),ROWSCOUNT int, reserveder varchar(50), datasize varchar(50), indexsize varchar(50), unused varchar(50))
DECLARE @TV3 TABLE ( DBName varchar(200),SchemaTAble varchar(500), TableName varchar(200))
DECLARE C Cursor for select quotename(name) as dbname from sys.databases where name <> 'tempdb' and state = 0
OPEN C
FETCH NEXT FROM C INTO @DBName
WHILE @@FETCH_STATUS = 0
BEGIN
DELETE FROM @TV3
SET @CMD =
@DBName+'..sp_msforeachtable ''exec sp_spaceused [?]'''
insert into @TV
EXEC (@CMD)
SET @CMD = 'select '''+@DBName+''' as DatabaseName, quotename(s.name)+''.''+quotename(t.name) as SchemaTable, quotename(t.name) TableName from '+@DBName+'.sys.tables t inner join '+@DBName+'.sys.schemas s on s.schema_id = t.schema_id '
insert into @TV3
EXEC (@CMD)
insert into @TV2
select @DBName ,t.name_table,t.ROWSCOUNT,t.reserveder,t.datasize,t.indexsize,t.unused from @TV t
inner join @TV3 s on quotename(t.name_table) = s.TableName and s.DBName = @DBName
FETCH NEXT FROM C INTO @DBNAME
END
CLOSE C
DEALLOCate C
select * from @TV2
Run Code Online (Sandbox Code Playgroud)
sp_spaceused
SQL Server 2016 和 SQL Server 2012 的用法有所不同。请注意,此代码仅适用于 SQL Server 2012。