关闭 x
IT技术网
    技 采 号
    ITJS.cn - 技术改变世界
    • 实用工具
    • 菜鸟教程
    IT采购网 中国存储网 科技号 CIO智库

    IT技术网

    IT采购网
    • 首页
    • 行业资讯
    • 系统运维
      • 操作系统
        • Windows
        • Linux
        • Mac OS
      • 数据库
        • MySQL
        • Oracle
        • SQL Server
      • 网站建设
    • 人工智能
    • 半导体芯片
    • 笔记本电脑
    • 智能手机
    • 智能汽车
    • 编程语言
    IT技术网 - ITJS.CN
    首页 » SQL语言 »存储过程:sp_MSforeachtable/sp_MSforeachdb

    存储过程:sp_MSforeachtable/sp_MSforeachdb

    2011-08-15 16:16:00 出处:ITJS
    分享

    SQL Server数据库的两个存储过程:sp_MSforeachtable/sp_MSforeachdb的参数说明及使用方法是本文我们主要要介绍的内容,接下来就让我们来一起了解一下这部分内容吧。

    1.简介:

    作为DBA会经常需要检查所有的数据库或用户表,比如:检查所有数据库的容量;看看指定数据库所有用户表的容量,所有表的记录数...,我们一般处理这样的问题都是用游标分别处理处理,比如:在数据库检索效率非常慢时,我们想检查数据库所有的用户表,我们就必须通过写游标来达到要求;假如我们用sp_MSforeachtable就可以非常方便的达到相同的目的:EXEC sp_MSforeachtable @command1="print ' ' DBCC CHECKTABLE (' ')"

    系统存储过程sp_MSforeachtable和sp_MSforeachdb,是微软提供的两个不公开的存储过程,从mssql6.5开始。存放在SQL Server的MASTER数据库中。可以用来对某个数据库的所有表或某个SQL服务器上的所有数据库进行管理,后面将对此进行详细介绍。

    2.参数说明:

    @command1 nvarchar(2000), --第一条运行的SQL指令

    @replacechar nchar(1) = N' ',--指定的占位符号

    @command2 nvarchar(2000)= null, --第二条运行的SQL指令

    @command3 nvarchar(2000)= null, --第三条运行的SQL指令

    @whereand nvarchar(2000)= null, --可选条件来选择表

    @precommand nvarchar(2000)= null, --执行指令前的操作(类似控件的触发前的操作)

    @postcommand nvarchar(2000)= null --执行指令后的操作(类似控件的触发后的操作)

    以后为sp_MSforeachtable的参数,sp_MSforeachdb不包括参数@whereand

    3.使用举例:

    --统计数据库里每个表的详细情况:

    exec sp_MSforeachtable @command1="sp_spaceused ' '"

    --获得每个表的记录数和容量:

    EXEC sp_MSforeachtable @command1="print ' '",  @command2="sp_spaceused ' '",  @command3= "SELECT count(*) FROM   " 

    --获得所有的数据库的存储空间:

    EXEC sp_MSforeachdb @command1="print ' '",  @command2="sp_spaceused " 

    --检查所有的数据库

    EXEC sp_MSforeachdb @command1="print ' '",  @command2="DBCC CHECKDB ( ) " 

    --更新PUBS数据库中已t开头的所有表的统计:

    EXEC sp_MSforeachtable @whereand="and name like 't%'",  @replacechar='*',  @precommand="print 'Updating Statistics.....' print ''",  @command1="print '*' update statistics * ",  @postcommand= "print''print 'Complete Update Statistics!'" 

    --删除当前数据库所有表中的数据

    sp_MSforeachtable @command1='Delete from  ' sp_MSforeachtable @command1 = "TRUNCATE TABLE  " 

    4.参数@whereand的用法:

    @whereand参数在存储过程中起到指令条件限制的作用,具体的写法如下:

    @whereend,可以这么写 @whereand=' AND o.name in (''Table1'',''Table2'',.......)'

    例如:我想更新Table1/Table2/Table3中NOTE列为NULL的值

    sp_MSforeachtable @command1='Update Set NOTE='''' Where NOTE is NULL',@whereand=' AND o.name in (''Table1'',''Table2'',''Table3'')'

    5." "在存储过程的特殊用法,造就了这两个功能强大的存储过程.

    这里" "的作用,相当于DOS命令中、以及我们在WINDOWS下搜索文件时的通配符的作用。

    6.小结

    有了上面的分析,我们可以建立自己的sp_MSforeachObject:(转贴)

    USE MASTER  GO  CREATE proc sp_MSforeachObject  @objectType int=1,  @command1 nvarchar(2000),   @replacechar nchar(1) = N' ',   @command2 nvarchar(2000) = null,  @command3 nvarchar(2000) = null,   @whereand nvarchar(2000) = null,  @precommand nvarchar(2000) = null,   @postcommand nvarchar(2000) = null  as  /* This proc returns one or more rows for each table (optionally, matching @where), with each table defaulting to its   own result set */  /* @precommand and @postcommand may be used to force a single result set via a temp table. */  /* Preprocessor won't replace within quotes so have to use str(). */  declare @mscat nvarchar(12)  select @mscat = ltrim(str(convert(int, 0x0002)))  if (@precommand is not null)  exec(@precommand)  /* Defined @isobject for save object type */  Declare @isobject varchar(256)  select @isobject= case @objectType when 1 then 'IsUserTable'  when 2 then 'IsView'  when 3 then 'IsTrigger'  when 4 then 'IsProcedure'   when 5 then 'IsDefault'   when 6 then 'IsForeignKey'  when 7 then 'IsScalarFunction'  when 8 then 'IsInlineFunction'  when 9 then 'IsPrimaryKey'  when 10 then 'IsExtendedProc'   when 11 then 'IsReplProc'  when 12 then 'IsRule'  end  /* Create the select */  /* Use @isobject variable isstead of IsUserTable string */  EXEC(N'declare hCForEach cursor global for select ''['' + REPLACE(user_name(uid), N'']'', N'']]'') + '']'' + ''.'' + ''['' +   REPLACE(object_name(id), N'']'', N'']]'') + '']'' from dbo.sysobjects o '  + N' where OBJECTPROPERTY(o.id, N'''+@isobject+''') = 1 '+N' and o.category & ' + @mscat + N' = 0 '  + @whereand)  declare @retval int  select @retval = @@error  if (@retval = 0)  exec @retval = sp_MSforeach_worker @command1, @replacechar, @command2, @command3  if (@retval = 0 and @postcommand is not null)  exec(@postcommand)  return @retval  GO 

    这样我们来测试一下:

    --获得所有的存储过程的脚本:

    EXEc sp_MSforeachObject @command1="sp_helptext ' ' ",@objectType=4 

    --获得所有的视图的脚本:

    EXEc sp_MSforeachObject @command1="sp_helptext ' ' ",@objectType=2 

    --比如在开发过程中,没一个用户都是自己的OBJECT OWNER,所以在真实的数据库时都要改为DBO:

    EXEc sp_MSforeachObject @command1="sp_changeobjectowner ' ', 'dbo'",@objectType=1 EXEc sp_MSforeachObject @command1="sp_changeobjectowner ' ', 'dbo'",@objectType=2 EXEc sp_MSforeachObject @command1="sp_changeobjectowner ' ', 'dbo'",@objectType=3 EXEc sp_MSforeachObject @command1="sp_changeobjectowner ' ', 'dbo'",@objectType=4 

    这样就非常方便的将每一个数据库对象改为DBO。

    关于SQL Server数据库的两个存储过程:sp_MSforeachtable/sp_MSforeachdb的知识就介绍到这里了,希望本次的介绍能够对您有所收获!

    上一篇返回首页 下一篇

    声明: 此文观点不代表本站立场;转载务必保留本文链接;版权疑问请联系我们。

    别人在看

    正版 Windows 11产品密钥怎么查找/查看?

    还有3个月,微软将停止 Windows 10 的更新

    Windows 10 终止支持后,企业为何要立即升级?

    Windows 10 将于 2025年10 月终止技术支持,建议迁移到 Windows 11

    Windows 12 发布推迟,微软正全力筹备Windows 11 25H2更新

    Linux 退出 mail的命令是什么

    Linux 提醒 No space left on device,但我的空间看起来还有不少空余呢

    hiberfil.sys文件可以删除吗?了解该文件并手把手教你删除C盘的hiberfil.sys文件

    Window 10和 Windows 11哪个好?答案是:看你自己的需求

    盗版软件成公司里的“隐形炸弹”?老板们的“法务噩梦” 有救了!

    IT头条

    公安部:我国在售汽车搭载的“智驾”系统都不具备“自动驾驶”功能

    02:03

    液冷服务器概念股走强,博汇、润泽等液冷概念股票大涨

    01:17

    亚太地区的 AI 驱动型医疗保健:2025 年及以后的下一步是什么?

    16:30

    智能手机市场风云:iPhone领跑销量榜,华为缺席引争议

    15:43

    大数据算法和“老师傅”经验叠加 智慧化收储粮食尽显“科技范”

    15:17

    技术热点

    SQL汉字转换为拼音的函数

    windows 7系统无法运行Photoshop CS3的解决方法

    巧用MySQL加密函数对Web网站敏感数据进行保护

    MySQL基础知识简介

    Windows7和WinXP下如何实现不输密码自动登录系统的设置方法介绍

    windows 7系统ip地址冲突怎么办?windows 7系统IP地址冲突问题的

      友情链接:
    • IT采购网
    • 科技号
    • 中国存储网
    • 存储网
    • 半导体联盟
    • 医疗软件网
    • 软件中国
    • ITbrand
    • 采购中国
    • CIO智库
    • 考研题库
    • 法务网
    • AI工具网
    • 电子芯片网
    • 安全库
    • 隐私保护
    • 版权申明
    • 联系我们
    IT技术网 版权所有 © 2020-2025,京ICP备14047533号-20,Power by OK设计网

    在上方输入关键词后,回车键 开始搜索。Esc键 取消该搜索窗口。