要写一个存储过程来获得SQLSERVER服务器上面所有的数据库的已分配空间大小和已使用的空间大小。--获得数据库页文件大小
DECLARE @PageSize float 
SELECT @PageSize=v.low/1024.0 FROM master..spt_values v WHERE v.number=1 AND v.type='E'create table #tmplogspc (DatabaseName sysname, LogSize float, SpaceUsedPerc float, Status bit)
insert #tmplogspc EXEC ('dbcc sqlperf(logspace)')
--select * from #tmplogspc--每个库的已分配空间由mdf和ldf两部分组成,相应的已使用空间就是ldfuse+mdfuse
create table #tmpdbspc (DBname sysname, ldfuse float,ldf float,mdfuse float,mdf float,Status bit)
insert #tmpdbspc select DatabaseName,Logsize*SpaceUsedPerc*10.24,0,0,0,0 from #tmplogspc
--上面的insert已经得到了所有数据库的ldfuse,然后希望在下面得到所有数据库的ldf和mdf
--通过select size from 数据库名.dbo.sysfiles where groupid=0 可以得到每个数据库的idf
--groupid=1的时候可以得到mdf,所以希望在下面用一个循环把每条记录的mdf和ldf更新,更新后的Status改成1
while (exists (select 1 from #tmpdbspc where Status =0))
begin
declare @dbname sysname
declare @sqlstr nvarchar(1000)
declare @ldf float,@mdf float
select top 1 @dbname = DBname  from #tmpdbspc where Status =0
set @sqlstr='select @ldf=size*@PageSize into from '+@dbname+'.dbo.sysfiles where groupid = 0'
--print @sqlstr
--这个语句在外面执行得到了正确的结果,但是在下面使用sp_executesql执行的时候提示@ldf和@PageSize没有定义
--目前在这里卡住了,怎么解决啊
exec sp_executesql @sqlstr
--print @ldf
--后面就是用同样的方法得到@mdf,然后update到#tmpdbspc里面了
end
select *from #tmpdbspc
drop table #tmplogspc
drop table #tmpdbspc
请各位大侠帮帮忙看看,我昨天注册的,全部就这些分了。急啊,今天就要交了。我的MSN:[email protected] 

解决方案 »

  1.   


    --如何将exec执行结果放入变量中?  declare   @num   int,   @sql   nvarchar(4000)  
    set   @sql= 'select   @a=count(*)   from   tableName   '  
    exec   sp_executesql   @sql,N '@a   int   output ',@num   output  
    select   @num  
      

  2.   

    declare @ldf int 
      set @sqlstr='select @ldf=size*@PageSize into from '+@dbname+'.dbo.sysfiles where groupid = 0'
        --print @sqlstr
        --这个语句在外面执行得到了正确的结果,但是在下面使用sp_executesql执行的时候提示@ldf和@PageSize没有定义
        --目前在这里卡住了,怎么解决啊
        exec sp_executesql @sqlstr,N' @ldf int output',@ldf output
      

  3.   

    declare @ldf int 
    set @sqlstr='select @ldf=size* '+ ltrim(@PageSize)+' from '+@dbname+'.dbo.sysfiles where groupid = 0' 
    --print @sqlstr exec sp_executesql @sqlstr,N' @ldf int output',@ldf output 
      

  4.   

    declare @dbname sysname
    declare @sqlstr nvarchar(1000)
    declare @ldf float,@mdf float
    select top 1 @dbname = DBname  from #tmpdbspc where Status =0
    set @sqlstr='select @ldf=size* '+ ltrim(@PageSize)+' from '+@dbname+'.dbo.sysfiles where groupid = 0' 
    print @sqlstr
    exec sp_executesql @sqlstr,N' @ldf int output',@ldf output