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

海宏软件的个人主页

用机器解放人的双手

 
 
 

日志

 
 

2008年7月8日  

2008-07-08 22:06:36|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

SQL Server未公开的两个存储过程

        Sp_MSForEachTable和sp_MSForEachDb是SQL Server的两个系统存储过程,存在于Master数据库当中,但是在SQL Server的联机帮助中并没有这两个存储过程,也就是说微软并没有把这两个存储过程编进SQL Server的联机丛书中。那么Microsoft设计这两个系统存储过程的目的到底是什么呢?这两个系统存储过程又能干些什么呢?实际上Microsoft设计这两个系统存储过程的目的是要支持编写一种单一的SQL语句,该语句可以在当前服务器的所有数据库上或当前数据库的所有表上执行相同的动作。下面介绍这两个存储过程。

        首先看下这条SQL语句:exec sp_MSForEachDb @Command1 = “print ‘?’” ,该SQL语句从当前服务器中的所有的数据名称。执行结果如图:

                                    2008年7月8日 - 海宏 - 海宏软件的个人主页

@Command1参数用于指定存储过程将在每个数据库上执行的动作。这里使用问号代替了数据库名称,该存储过程最多可以指定三个命令(使用@Command2 、@Command3)。在后台,这个存储过程将在sysdatabases表中为每一条记录打开一个游标,然后动态组装一个将通过循环在每条记录上执行的批处理。这条语句将显示每个数据库中的用户表的数目:exec sp_MSForEachDb @Command1 = "select count(name) from ?.dbo.sysobjects where xtype='U'",执行结果如图:

                        2008年7月8日 - 海宏 - 海宏软件的个人主页

下面的命令创建了一个有关每个数据库空间使用情况的报告:exec sp_MSForEachDb @Command1 = "use ? exec sp_Spaceused",执行结果如图:

         2008年7月8日 - 海宏 - 海宏软件的个人主页

更为有趣的是可以在当前数据库的所有表上运行sp_spaceused过程:exec sp_MSForEachtable @Command1 = "sp_Spaceused '?'",你也可以在每一个表上得到一些记录:exec sp_MSForEachtable @Command1 = "print '?'",@Command2 = "select count(*) from ?",执行结果并没有按照所希望的顺序排列,如果你想按照表名对它进行排列,必须使用@whereand参数:exec sp_MSForEachtable @Command1 = "exec sp_Spaceused '?'",@whereand = " order by name",这个参数本来是用来添加where子查询用的,但是因为查询时动态的组装的,所以你可以借用一下来加入一个Order by子句。

        再给你偷一个小窍门,也就是如果一个命令在循环之前或之后只应该执行一次,那么你可以使用@precommand或@postcommand参数;还有你也还可以使用@replacechar参数来为数据库名称和表名指定不同的占位符,这个参数在命令需要使用问号时十分有用,例如,Like子句中的通配符等。

        以前,在检查所有数据库的容量;看看指定数据库所有用户表的容量,所有表的记录数等工作时需要写一些游标来完成这些工作,不但费劲费时,而且游标的效率也不高,好了,有了这两个存储过程,你就可以轻而易举的完成这些工作了。大家感兴趣的话,可以去看看这两个存储过程的源代码,这里就不再把它贴出来了。

posted on 2005-09-10 15:05 振河 阅读(2444) 评论(4)  编辑 收藏 所属分类: SQL Server 2000

  评论这张
 
阅读(351)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

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

页脚

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