实用的存储过程之一

存储过程

实用的存储过程之一
笔者工作的公司采用的是SQLServer数据库,每天都要处理大量的数据,由于笔者进公司的时间比较晚,公司现有的大部分的程序都是以前的程序员留下的,因为他们没有相关的文档,笔者对于后台数据库的很多表的结构和数据都不甚了解,给日常的维护造成了很大的麻烦。

在对后台数据库进行研究的过程中,我需要得到数据库的某些相关信息,比如,我希望知道各个用户表占用多少磁盘空间,并且排列出来,可以让我知道哪些表比较大,数据比较多等等——我相信,这可能也是不少数据库管理员所关心的问题,所以我决心做一个通用的存储过程。我对系统的存储过程sp_spaceused加了一些改动,以适合我的要求。希望这个存储过程能对大家有些帮助。存储过程如下:

if exists(select name from sysobjects where name='spaceused' and type='p')

Drop procedure spaceused

GO

create procedure spaceused

as

begin

 

declare @id       int                  -- The object id of @objname.

declare @type       character(2) -- The object type.

declare       @pages       int                  -- Working variable for size calc.

declare @dbname sysname

declare @dbsize dec(15,0)

declare @logsize dec(15)

declare @bytesperpage       dec(15,0)

declare @pagesperMB              dec(15,0)

declare @objname nvarchar(776)        -- The object we want size on.

declare @updateusage varchar(5)             -- Param. for specifying that

 

create table #temp1

(

       表名              varchar(200) null,

       行数               char(11) null,

       保留空间        varchar(15) null,

       数据使用空间       varchar(15) null,

       索引使用空间       varchar(15) null,

        未用空间          varchar(15) null

)

--select @objname='N_dep'                               -- usage info. should be updated.

select @updateusage='false'

/*Create temp tables before any DML to ensure dynamic

**  We need to create a temp table to do the calculation.

**  reserved: sum(reserved) where indid in (0, 1, 255)

**  data: sum(dpages) where indid < 2 + sum(used) where indid = 255 (text)

**  indexp: sum(used) where indid in (0, 1, 255) - data

**  unused: sum(reserved) - sum(used) where indid in (0, 1, 255)

*/

declare cur_table cursor for

  select name from sysobjects where type='u'

 

Open cur_table

fetch next from cur_table into @objname

 

While @@FETCH_STATUS=0

begin

create table #spt_space

(

       rows              int null,

       reserved    dec(15) null,

       data        dec(15) null,

       indexp             dec(15) null,

       unused             dec(15) null

)

 

/*

**  Check to see if user wants usages updated.

*/

 

if @updateusage is not null

       begin

              select @updateusage=lower(@updateusage)

 

              if @updateusage not in ('true','false')

                     begin

                            raiserror(15143,-1,-1,@updateusage)

                            return(1)

                     end

       end

/*

**  Check to see that the objname is local.

*/

if @objname IS NOT NULL

begin

 

       select @dbname = parsename(@objname, 3)

 

       if @dbname is not null and @dbname <> db_name()

              begin

                     raiserror(15250,-1,-1)

                     return (1)

              end

 

       if @dbname is null

              select @dbname = db_name()

 

       /*

       **  Try to find the object.

       */

       select @id = null

       select @id = id, @type = xtype

              from sysobjects

                     where id = object_id(@objname)

 

       /*

       **  Does the object exist?

       */

       if @id is null

              begin

                     raiserror(15009,-1,-1,@objname,@dbname)

                     return (1)

              end

 

 

       if not exists (select * from sysindexes

                            where @id = id and indid < 2)

 

              if      @type in ('P ','D ','R ','TR','C ','RF') --data stored in sysprocedures

                            begin

                                   raiserror(15234,-1,-1)

                                   return (1)

                            end

              else if @type = 'V ' -- View => no physical data storage.

                            begin

                                   raiserror(15235,-1,-1)

                                   return (1)

                            end

              else if @type in ('PK','UQ') -- no physical data storage. --?!?! too many similar messages

                            begin

                                   raiserror(15064,-1,-1)

                                   return (1)

                            end

              else if @type = 'F ' -- FK => no physical data storage.

                            begin

                                   raiserror(15275,-1,-1)

                                   return (1)

                            end

end

 

/*

**  Update usages if user specified to do so.

*/

 

if @updateusage = 'true'

       begin

              if @objname is null

                     dbcc updateusage(0) with no_infomsgs

              else

                     dbcc updateusage(0,@objname) with no_infomsgs

              print ' '

       end

 

 

set nocount on

 

/*

**  If @id is null, then we want summary data.

*/

/*    Space used calculated in the following way

**       @dbsize = Pages used

**       @bytesperpage = d.low (where d = master.dbo.spt_values) is

**    the # of bytes per page when d.type = 'E' and

**       d.number = 1.

**    Size = @dbsize * d.low / (1048576 (OR 1 MB))

*/

if @id is null

begin

       select @dbsize = sum(convert(dec(15),size))

              from dbo.sysfiles

              where (status & 64 = 0)

 

       select @logsize = sum(convert(dec(15),size))

              from dbo.sysfiles

              where (status & 64 <> 0)

 

       select @bytesperpage = low

              from master.dbo.spt_values

              where number = 1

                     and type = 'E'

       select @pagesperMB = 1048576 / @bytesperpage

 

       select  database_name = db_name(),

              database_size =

                     ltrim(str((@dbsize + @logsize) / @pagesperMB,15,2) + ' MB'),

              'unallocated space' =

                     ltrim(str((@dbsize -

                            (select sum(convert(dec(15),reserved))

                                   from sysindexes

                                          where indid in (0, 1, 255)

                            )) / @pagesperMB,15,2)+ ' MB')

 

       print ' '

       /*

       **  Now calculate the summary data.

       **  reserved: sum(reserved) where indid in (0, 1, 255)

       */

       insert into #spt_space (reserved)

              select sum(convert(dec(15),reserved))

                     from sysindexes

                            where indid in (0, 1, 255)

 

       /*

      ** data: sum(dpages) where indid < 2

       **    + sum(used) where indid = 255 (text)

       */

       select @pages = sum(convert(dec(15),dpages))

                     from sysindexes

                            where indid < 2

       select @pages = @pages + isnull(sum(convert(dec(15),used)), 0)

              from sysindexes

                     where indid = 255

       update #spt_space

              set data = @pages

 

 

       /* index: sum(used) where indid in (0, 1, 255) - data */

       update #spt_space

              set indexp = (select sum(convert(dec(15),used))

                            from sysindexes

                                   where indid in (0, 1, 255))

                         - data

 

       /* unused: sum(reserved) - sum(used) where indid in (0, 1, 255) */

       update #spt_space

              set unused = reserved

                            - (select sum(convert(dec(15),used))

                                   from sysindexes

                                          where indid in (0, 1, 255))

 

       select reserved = ltrim(str(reserved * d.low / 1024.,15,0) +

                            ' ' + 'KB'),

              data = ltrim(str(data * d.low / 1024.,15,0) +

                            ' ' + 'KB'),

              index_size = ltrim(str(indexp * d.low / 1024.,15,0) +

                            ' ' + 'KB'),

              unused = ltrim(str(unused * d.low / 1024.,15,0) +

                            ' ' + 'KB')

              from #spt_space, master.dbo.spt_values d

              where d.number = 1

                     and d.type = 'E'

end

 

/*

**  We want a particular object.

*/

else

begin

       /*

       **  Now calculate the summary data.

       **  reserved: sum(reserved) where indid in (0, 1, 255)

       */

       insert into #spt_space (reserved)

              select sum(reserved)

                     from sysindexes

                            where indid in (0, 1, 255)

                                   and id = @id

 

       /*

      ** data: sum(dpages) where indid < 2

       **    + sum(used) where indid = 255 (text)

       */

       select @pages = sum(dpages)

                     from sysindexes

                            where indid < 2

                                   and id = @id

       select @pages = @pages + isnull(sum(used), 0)

              from sysindexes

                     where indid = 255

                            and id = @id

       update #spt_space

              set data = @pages

 

 

       /* index: sum(used) where indid in (0, 1, 255) - data */

       update #spt_space

              set indexp = (select sum(used)

                            from sysindexes

                                   where indid in (0, 1, 255)

                                          and id = @id)

                         - data

 

       /* unused: sum(reserved) - sum(used) where indid in (0, 1, 255) */

       update #spt_space

              set unused = reserved

                            - (select sum(used)

                                   from sysindexes

                                          where indid in (0, 1, 255)

                                                 and id = @id)

       update #spt_space

              set rows = i.rows

                     from sysindexes i

                            where i.indid < 2

                                   and i.id = @id

        insert into #temp1

       select name = object_name(@id),

              rows = convert(char(11), rows),

              reserved = ltrim(str(reserved * d.low / 1024.,15,0) +

                            ' ' + 'KB'),

              data = ltrim(str(data * d.low / 1024.,15,0) +

                            ' ' + 'KB'),

              index_size = ltrim(str(indexp * d.low / 1024.,15,0) +

                            ' ' + 'KB'),

              unused = ltrim(str(unused * d.low / 1024.,15,0) +

                            ' ' + 'KB')

       from #spt_space, master.dbo.spt_values d

              where d.number = 1

                     and d.type = 'E'

Drop table #spt_space

end

fetch next from cur_table into @objname

end

Close cur_table

DEALLOCATE cur_table

Select * from #temp1 order by len(保留空间) desc,保留空间 desc

Drop table #temp1

return (0)

end

原理很简单,相信大家都能看懂,sp_spaceused几乎原封不动地保留下来,调用也很简单,直接执行即可,没有任何参数,存储过程执行后,将把当前连接的数据库中所有数据表按照从大到小排列出来,还有其他的相关信息。如果能对大家有所参考价值,就请大家能给forgot2000一点掌声鼓励吧,谢谢!

本存储过程在SQLServer7.0/2000下通过。

本人QQ:33563255,E-mail:coolforgot@sina.com

 

 

时间: 2024-10-31 09:27:00

实用的存储过程之一的相关文章

实用的存储过程之二

存储过程 实用的存储过程之二笔者工作的公司采用的是SQLServer数据库,每天都要处理大量的数据,由于笔者进公司的时间比较晚,公司现有的大部分的程序都是以前的程序员留下的,因为他们没有相关的文档,笔者对于后台数据库的很多表的结构和数据都不甚了解,给日常的维护造成了很大的麻烦. 在对后台数据库进行研究的过程中,我需要得到数据库的某些相关信息,比如,公司的数据库中有几个表存放笔者的个人资料,像人事表.工资表.部门表等等,但具体是哪些表,就不是很清楚了,如果要一个一个表地找,可能天亮了也找不完,所以

asp.net安全、实用、简单的大容量存储过程分页第1/2页_实用技巧

基本上我下面要讲述的侧重点是如何使用,因为其实分页存储过程网上很多,如果你懒得找,那么可以直接使用下面这个我经过测试,并通过修改,网上评价都比较高的分页存储过程. 这个分页主要优点如下: 1.大容量下的数据分页,我的测试数据是520W. 2.我结合aspnetpager控件,使得使用起来更加方便. 3.为了结构清晰,实用3层. 4.安全,你就放心的用吧.SQL注入的问题在这里你可以放心了.网上有文章说只要存储过程是用sql拼接的就存在sql注入的问题,并且直接在sql查询分析器中测试了注入的情况

asp.net 安全、实用、简单的大容量存储过程分页第1/2页_实用技巧

基本上我下面要讲述的侧重点是如何使用,因为其实分页存储过程网上很多,如果你懒得找,那么可以直接使用下面这个我经过测试,并通过修改,网上评价都比较高的分页存储过程. 这个分页主要优点如下: 1.大容量下的数据分页,我的测试数据是520W. 2.我结合aspnetpager控件,使得使用起来更加方便. 3.为了结构清晰,实用3层. 4.安全,你就放心的用吧.SQL注入的问题在这里你可以放心了.网上有文章说只要存储过程是用sql拼接的就存在sql注入的问题,并且直接在sql查询分析器中测试了注入的情况

一个Asp.Net的显示分页方法 附加实体转换和存储过程 带源码下载_实用技巧

之前自己一直用Aspnetpager控件来显示项目中的分页,但是每次都要拖一个aspnetpager的控件进去,感觉很不舒服,因为现在自己写的webform都不用服务器控件了,所以自己仿照aspnetpager写了一个精简实用的返回分页显示的html方法,其他话不说了,直接上代码.分页显示信息的实体类: 复制代码 代码如下: public class Pager    {        private string _firstPageText;        /// <summary>   

asp.net中IDataParameter调用存储过程的实现方法_实用技巧

本文实例讲述了asp.net中IDataParameter调用存储过程的实现方法,是asp.net数据库程序设计中非常实用的技巧.分享给大家供大家参考. 具体实现方法如下: public string GenerateExamePaper(string paperType, string driverID, string MacAddr) { int i; IDataParameter[] iData = new SqlParameter[4]; iData[0] = new SqlParame

一个比较实用的大数据量分页存储过程

比较|存储过程|分页|数据 create proc sp_PublicTurnPageWebSite( @TBName  nvarchar(100)='', --表名,如 pinyin @PageSize int=10,   --每页的记录数,默认为 10 @CurPage int=1,   --表示当前页 1 @KeyField nvarchar(100)='ID', --关键字段名,默认为 ID,该字段要求是表中的索引 或 无重复和不为空的字段 @KeyAscDesc nvarchar(4)

.net调用存储过程详细介绍_实用技巧

 连接字符串   复制代码 代码如下:  string conn = ConfigurationManager.ConnectionStrings["NorthwindConnectionString"].ConnectionString;   confige文件  复制代码 代码如下:      <connectionStrings>        <add name="NorthwindConnectionString" connectionS

asp.net sql存储过程_实用技巧

Visual Studio.Net为SQL的存储过程提供了强大的支持,您既可以通过visual studio.net来新建存储过程,也可以直接在Sql Server的查询分析器中运行,还可以通过企业管理器创建,使用起来也非常方便.大家一直都误认为SQL存储过程是一个比较"高深"的技术,其实掌握一般的语法是没有什么大问题的,而我们在使用存储教程中也主要是增删减的操作,学会使用一般的T-SQL就很容易上手了. 我们先来看一下在Sql-server中是如何创建一个存储过程的吧,我们可以使用S

asp.net中调用存储过程的方法_实用技巧

本文实例讲述了asp.net中调用存储过程的方法.分享给大家供大家参考,具体如下: 一.建立并调用一个不带参数的存储过程如下: CREATE PROCEDURE 全部学生<dbo.selectUsers> AS SELECT * FROM 学生 GO EXEC 全部学生 建立并调用一个带参数的存储过程如下: CREATE PROCEDURE 学生查询1 @SNAME VARCHAR(8),@SDEPT VARCHAR(20) AS SELECT * FROM 学生 WHERE 姓名=@SNAM