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 ‘?'”

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

    EXECsp_MSforeachtable@command1="print'?'", @command2="sp_spaceused'?'", @command3="SELECTcount(*)FROM?"

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

    EXECsp_MSforeachdb@command1="print'?'", @command2="sp_spaceused"

–检查所有的数据库

    EXECsp_MSforeachdb@command1="print'?'", @command2="DBCCCHECKDB(?)"

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

    EXECsp_MSforeachtable@whereand="andnamelike't%'", @replacechar='*', @precommand="print'UpdatingStatistics.....'print''", @command1="print'*'updatestatistics*", @postcommand="print''print'CompleteUpdateStatistics!'"

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

    sp_MSforeachtable@command1='Deletefrom?'sp_MSforeachtable@command1="TRUNCATETABLE?"

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:(转贴)

    USEMASTER GO CREATEprocsp_MSforeachObject @objectTypeint=1, @command1nvarchar(2000), @replacecharnchar(1)=N'?', @command2nvarchar(2000)=null, @command3nvarchar(2000)=null, @whereandnvarchar(2000)=null, @precommandnvarchar(2000)=null, @postcommandnvarchar(2000)=null as /*Thisprocreturnsoneormorerowsforeachtable(optionally,matching@where),witheachtabledefaultingtoits ownresultset*/ /*@precommandand@postcommandmaybeusedtoforceasingleresultsetviaatemptable.*/ /*Preprocessorwon'treplacewithinquotessohavetousestr().*/ declare@mscatnvarchar(12) select@mscat=ltrim(str(convert(int,0x0002))) if(@precommandisnotnull) exec(@precommand) /*Defined@isobjectforsaveobjecttype*/ Declare@isobjectvarchar(256) select@isobject=case@objectTypewhen1then'IsUserTable' when2then'IsView' when3then'IsTrigger' when4then'IsProcedure' when5then'IsDefault' when6then'IsForeignKey' when7then'IsScalarFunction' when8then'IsInlineFunction' when9then'IsPrimaryKey' when10then'IsExtendedProc' when11then'IsReplProc' when12then'IsRule' end /*Createtheselect*/ /*Use@isobjectvariableissteadofIsUserTablestring*/ EXEC(N'declarehCForEachcursorglobalforselect''[''+REPLACE(user_name(uid),N'']'',N'']]'')+'']''+''.''+''[''+ REPLACE(object_name(id),N'']'',N'']]'')+'']''fromdbo.sysobjectso' +N'whereOBJECTPROPERTY(o.id,N'''+@isobject+''')=1'+N'ando.category&'+@mscat+N'=0' +@whereand) declare@retvalint select@retval=@@error if(@retval=0) exec@retval=sp_MSforeach_worker@command1,@replacechar,@command2,@command3 if(@retval=0and@postcommandisnotnull) exec(@postcommand) return@retval GO

这样我们来测试一下: –获得所有的存储过程的脚本:

    EXEcsp_MSforeachObject@command1="sp_helptext'?'",@objectType=4

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

    EXEcsp_MSforeachObject@command1="sp_helptext'?'",@objectType=2

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

    EXEcsp_MSforeachObject@command1="sp_changeobjectowner'?','dbo'",@objectType=1EXEcsp_MSforeachObject@command1="sp_changeobjectowner'?','dbo'",@objectType=2EXEcsp_MSforeachObject@command1="sp_changeobjectowner'?','dbo'",@objectType=3EXEcsp_MSforeachObject@command1="sp_changeobjectowner'?','dbo'",@objectType=4

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

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

【编辑推荐】

    SQL Server数据库存储过程的异常处理SQL Server数据库利用SQL语句使用事务详解SQL Server数据库ROW_NUMBER()函数使用详解关闭SQL Server 2005远程连接以及其它对外服务SQL Server数据库DATEDIFF的参数介绍及使用示例