简单的解决办法:用多了一个“缓冲”表,先插入到缓存表,然后从它变成“主”临时表的规范DBNAME
CREATE TABLE #tmpTableSizes
(
dbName varchar(100),
tableName varchar(100),
numberofRows varchar(100),
reservedSize varchar(50),
dataSize varchar(50),
indexSize varchar(50),
unusedSize varchar(50)
)
CREATE TABLE #tmpTableSizesDB
(
tableName varchar(100),
numberofRows varchar(100),
reservedSize varchar(50),
dataSize varchar(50),
indexSize varchar(50),
unusedSize varchar(50)
)
insert #tmpTableSizesDB
EXEC AAABD.dbo.sp_MSforeachtable @command1="EXEC sp_spaceused '?'"
insert into #tempTableSizes
select 'AAABD', * from #tempTableSizesDB
truncate table #tempTableSizesDB
insert #tmpTableSizesDB
EXEC BBBDB.dbo.sp_MSforeachtable @command1="EXEC sp_spaceused '?'"
insert into #tempTableSizes
select 'BBBDB', * from #tempTableSizesDB
truncate table #tempTableSizesDB
insert #tmpTableSizesDB
EXEC CCCDB.dbo.sp_MSforeachtable @command1="EXEC sp_spaceused '?'"
insert into #tempTableSizes
select 'CCCDB', * from #tempTableSizesDB
或者你也可以使用动态SQL中环做:
create table dbo.#DBases (Name nvarchar(100))
insert into dbo.#DBases
select 'AAABD'
union all
select 'BBBDB'
union all
select 'CCCDB'
create table dbo.#tmpTableSizes
(
dbName varchar(100),
tableName varchar(100),
numberofRows varchar(100),
reservedSize varchar(50),
dataSize varchar(50),
indexSize varchar(50),
unusedSize varchar(50)
)
create table dbo.#tmpTableSizesDB
(
tableName varchar(100),
numberofRows varchar(100),
reservedSize varchar(50),
dataSize varchar(50),
indexSize varchar(50),
unusedSize varchar(50)
)
declare @stmt nvarchar(max), @DBName nvarchar(100)
declare cur cursor for select Name from dbo.#DBases
open cur
fetch next from cur into @DBName
while (@@fetch_status = 0)
begin
select @stmt = 'truncate table dbo.#tmpTableSizesDB
insert into dbo.#tmpTableSizesDB
EXEC ' + @DBName + '.dbo.sp_MSforeachtable @command1="EXEC sp_spaceused ''?''"
insert into dbo.#tmpTableSizes
select ''' + @DBName + ''', * from dbo.#tmpTableSizesDB'
exec sp_executesql @stmt = @stmt
fetch next from cur into @DBName
end
close cur
deallocate cur
drop table dbo.#tmpTableSizesDB
drop table dbo.#DBases
select * from dbo.#tmpTableSizes
这是有效的,但看起来不是很优雅,因为我有几个数据库,有可能在循环中做到这一点? – Whistler
@Whistler好吧,你可以在循环中使用一些动态sql来完成。 –
我试过了,但是,我怎样才能在EXEC AAABD.dbo.sp_MSforeachtable @ command1 =“EXEC sp_spaceused'?'”中替换动态db名称(AAABD)? – Whistler