我爱Aspx >> C#.Net >> 浅析SQL SERVER一个没有公开的存储过程_数据库技巧
从SQLSERVER6.5开始,MS提供了一个非常有用的系统存储过程sp_MSforeachtable和sp_MSforeachDB;作为DBA会经常需要检查所有的数据库或用户表,比如:检查所有数据库的容量;看看指定数据库所有用户表的容量,所有表的记录数...,我们一般处理这样的问题都是用游标分别处理处理,比如:在数据库检索效率非常慢时,我们想检查数据库所有的用户表,我们就必须这样写游标:
DECLARE @TableName varchar(255)
DECLARE @ExeSQL varchar(4000)
DECLARE Table_Cursor CURSOR FOR SELECT [name] FROM sysobjects WHERE xtype='U'
OPEN Table_Cursor
FETCH NEXT FROM Table_Cursor INTO @TableName
WHILE(@@FETCH_STATUS=0)
BEGIN
PRINT @TableName
SELECT @ExeSQL='DBCC CHECKTABLE('''+@TableName+''')'
EXEC(@EXESQL)
FETCH NEXT FROM Table_Cursor INTO @TableName
END
CLOSE Table_Cursor
DEALLOCATE Table_Cursor
GO
如果我们用sp_MSforeachtable就可以非常方便的达到相同的目的:
EXEC sp_MSforeachtable @command1="print '?' DBCC CHECKTABLE('?')"
大家可以看出这样就更加简洁(虽然在后台也是通过游标来处理的),下面我们就仔细分析一下sp_MSforeachtable这个存储过程:
我们看看sp_MSforeachtable详细的CODE:
USE MASTER
GO
SP_HELPTEXT sp_MSforeachtable
--下面时sp_MSforeachtable的原始代码
CREATE proc sp_MSforeachtable
@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
Ҷƪл˵?
使用存储过程时一个错误的解决方..[04-28]
SqlServer存储过程/函数加/解密_..[04-28]
用存储过程几个最直接的好处_数据..[04-28]
asp.net(C#)海量数据表高效率分页..[04-28]
调用存储过程并且使用返回值的基..[04-28]
一个容易忽视的存储过程问题_数据..[04-28]
小记存储过程中经常用到的本周,..[04-28]
[SQLServer][DTS][存储过程]将DT..[04-28]
在Access中模拟sql server存储过..[04-28]
SQL 存储过程&算法_数据库技..[04-28]
使用存储过程时一个错误的解决方..[04-28]
ASP中存储过程调用的两种方式及比..[04-28]
一些不长见的ASP调用存储过程的技..[04-28]
各种存储过程使用指南_ASP实例[04-28]
SqlServer存储过程/函数加/解密_..[04-28]
用存储过程几个最直接的好处_数据..[04-28]
IBatisNet系列-执行存储过程_ASP..[04-28]
asp.net(C#)海量数据表高效率分页..[04-28]
调用存储过程并且使用返回值的基..[04-28]
一个容易忽视的存储过程问题_数据..[04-28]