SQL Server未公开的两个存储过程
Sp_MSForEachTable和sp_MSForEachDb是SQL Server的两个系统存储过程,存在于Master数据库当中,但是在SQL Server的联机帮助中并没有这两个存储过程,也就是说微软并没有把这两个存储过程编进SQL Server的联机丛书中。那么Microsoft设计这两个系统存储过程的目的到底是什么呢?这两个系统存储过程又能干些什么呢?实际上Microsoft设计这两个系统存储过程的目的是要支持编写一种单一的SQL语句,该语句可以在当前服务器的所有数据库上或当前数据库的所有表上执行相同的动作。下面介绍这两个存储过程。
首先看下这条SQL语句:exec sp_MSForEachDb @Command1 = “print ‘?’” ,该SQL语句从当前服务器中的所有的数据名称。执行结果如图:
@Command1参数用于指定存储过程将在每个数据库上执行的动作。这里使用问号代替了数据库名称,该存储过程最多可以指定三个命令(使用@Command2 、@Command3)。在后台,这个存储过程将在sysdatabases表中为每一条记录打开一个游标,然后动态组装一个将通过循环在每条记录上执行的批处理。这条语句将显示每个数据库中的用户表的数目:exec sp_MSForEachDb @Command1 = "select count(name) from ?.dbo.sysobjects where xtype='U'",执行结果如图:
下面的命令创建了一个有关每个数据库空间使用情况的报告:exec sp_MSForEachDb @Command1 = "use ? exec sp_Spaceused",执行结果如图:
更为有趣的是可以在当前数据库的所有表上运行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子句中的通配符等。
以前,在检查所有数据库的容量;看看指定数据库所有用户表的容量,所有表的记录数等工作时需要写一些游标来完成这些工作,不但费劲费时,而且游标的效率也不高,好了,有了这两个存储过程,你就可以轻而易举的完成这些工作了。大家感兴趣的话,可以去看看这两个存储过程的源代码,这里就不再把它贴出来了。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现