• λ我爱Aspx >> C#.Net >> 浅析SQL SERVER一个没有公开的存储过程_数据库技巧
  • 浅析SQL SERVER一个没有公开的存储过程_数据库技巧

  • :aspxer  Դ:internet  :2007-4-28 23:44:56  ؼ:sql,数据库,数据
  • 从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

    Ҷƪл˵?
  • һƪ存储过程编写经验和优化措施_数据库技巧
    һƪ使用存储过程时一个错误的解决方法_数据库技巧