注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Computer Science

I Pressed My Words Here. Will You Read ?

 
 
 

日志

 
 

MSSQL Server 中获取当前数据库的空间使用百分比值  

2011-09-14 16:26:34|  分类: My Projects |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
这里提供一个存储过程,实现了获取当前数据库名称及其空间使用百分比。
入参中第一个为DEFAULT(默认值@@SPID)时,表示获取当前数据库的空间数据占用百分比。当输入其他数据库的spid时,便能用于获取spid对应的数据库名称和其空间数据占用百分比。
另外两个出参分别为,数据库名称 和 空间数据占用百分比。
SQL 代码如下:
USE [databaseName]
GO

/****** Object:  StoredProcedure [dbo].[p_get_current_database_useage_info]    Script Date: 09/14/2011 15:29:42 ******/
IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[p_get_current_database_useage_info]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[p_get_current_database_useage_info]
GO

USE [databaseName]
GO

/****** Object:  StoredProcedure [dbo].[p_get_current_database_useage_info]    Script Date: 09/14/2011 15:29:42 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

-- =============================================
-- Author:        Will
-- Create date: 14092011
-- Description:    GET CURRENT DATABASE's USEAGE INFORMATION,RETURN A STRING
-- =============================================
CREATE PROCEDURE [dbo].[p_get_current_database_useage_info]
    @spid smallint=@@SPID
AS
BEGIN
    DECLARE @t TABLE (tableName NVARCHAR(MAX))
    DECLARE @v_count numeric(38,0)
    DECLARE @tableUseage TABLE (name NVARCHAR(MAX)
                                ,rows NUMERIC(38,0)
                                ,reserved NVARCHAR(MAX)
                                ,data NVARCHAR(MAX)
                                ,index_size NVARCHAR(MAX)
                                ,unused NVARCHAR(MAX)
                               )
    DECLARE @v_name NVARCHAR(MAX)
    INSERT INTO @t SELECT o.name FROM dbo.sysobjects o
        WHERE OBJECTPROPERTY(o.id,N'IsUserTable')=1
            AND o.name NOT LIKE N'#%%'
            AND o.name NOT LIKE 'T_ZB_KH_Y%'
            AND o.name NOT LIKE 'LOGASSET%'
            AND o.name NOT IN ('SYSTEM','SYSAUX','CRMBAK')
            ORDER BY o.name
    SELECT @v_count=COUNT_BIG(1) FROM @t
    WHILE @v_count > 0
    BEGIN
        SELECT @v_name = name
            FROM (SELECT ROW_NUMBER() OVER(ORDER BY tableName) AS row_num,tableName name FROM @t) AS t
                WHERE t.row_num = @v_count
        INSERT INTO @tableUseage EXEC sp_spaceused @v_name
        SET @v_count = @v_count -1
    END
    RETURN SELECT db.name AS databaseName,ROUND((TOT_GROOTTE_KB-TOTAL_BYTES)*100/TOT_GROOTTE_KB,2) AS useagePercentage
        FROM (SELECT ROUND(SUM(CONVERT(BIGINT,SUBSTRING(unused,0,PATINDEX('%[a-z][A-Z]',unused)))),2) AS TOTAL_BYTES
            , ROUND(MAX(CONVERT(BIGINT,SUBSTRING(unused,0,PATINDEX('%[a-z][A-Z]',unused)))),2) AS MAX_BYTES
            , ROUND(SUM(CONVERT(BIGINT,SUBSTRING(reserved,0,PATINDEX('%[a-z][A-Z]',reserved)))),2) AS TOT_GROOTTE_KB
            FROM @tableUseage) tu,
                (SELECT NAME FROM master..sysdatabases
                    WHERE dbid= (SELECT dbid FROM master..sysprocesses
                                            WHERE spid = @spid)
    ) db

END

GO

存储过程的调用方法如下:
   DECLARE @databaseName NVARCHAR(MAX)
                   ,@useagePercentage smallint
   EXEC [dbo].[p_get_current_database_useage_info] DEFAULT,@databaseName OUTPUT,@useagePercentage OUTPUT
   PRINT @databaseName + @useagePercentage
.
  评论这张
 
阅读(753)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017