本人需要查询数据库中各个数据表大小,看到一个系统存储过程sp_MSforeachtable讲解
(http://hi.baidu.com/realknow/blog/item/b37f1f3b1979b2ef14cecbd2.html)
举例查询:
EXEC sp_MSforeachtable @command1="print '?'",
                       @command2="sp_spaceused '?'",
                       @command3= "SELECT count(*) FROM ? "请问参数中的问号“ ? ”是什么意思?  能否详细讲解下上面语句的语法结构和执行过程?感激
             

解决方案 »

  1.   

    sp_msforeachtable 里面那个问号指代数据库中所有的表
      

  2.   


    exec sp_msforeachtable @command1='print ''?'' dbcc checktable (''?'')'直接运行即可,如果时间较长,随时可以取消,然后看结果。
      

  3.   


    exec sp_msforeachtable @command1='print ''?'''你还是先运行这个吧,一看结果就明白了。
      

  4.   

    谢谢~ 
    那还有一点,请问既然问号代表所有的表  为何无法单独运行
    command中引用的参数“exec  sp_spaceused '?' ”呢?
      

  5.   

    可以单独运行
    例如
    exec sp_spaceused 'tablename'
    print 'tablename'把单一表名 变成? 放入sp_msforeachtable 的变量参数里面就循环执行可以了。
      

  6.   

    “?”是SQL占位符,在村过程称中会被替换成相应的值;
    mssql里sp_MSforeachtable的用法在master数据库里执行下面的语句可以看到proc详细的代码
    use master
    exec sp_helptext sp_MSforeachtable;sp_MSforeachtable系统存储过程有7个参数,解释如下:@command1 nvarchar(2000),  --第一条运行的T-SQL指令
    @replacechar nchar(1) = N'?',   --指定的占位符号 
    @command2 nvarchar(2000)= null,--第二条运行的T-SQL指令
    @command3 nvarchar(2000)= null, --第三条运行的T-SQL指令
    @whereand nvarchar(2000)= null, --可选条件来选择表
    @precommand nvarchar(2000)= null, --在表前执行的指令
    @postcommand nvarchar(2000)= null --在表后执行的指令  mssql里sp_MSforeachtable的用法
    --统计数据库里每个表的详细情况:exec sp_MSforeachtable @command1="sp_spaceused '?'"--查询数据库所有表的记录总数
    CREATE TABLE #temp (TableName VARCHAR (255), RowCnt INT)
    EXEC sp_MSforeachtable 'INSERT INTO #temp SELECT ''?'', COUNT(*) FROM ?'
    SELECT TableName, RowCnt FROM #temp ORDER BY TableName
    DROP TABLE #temp
     
    --检查数据库里每个表或索引视图的数据、索引及text、ntext 和image 页的完整性--下列语句需在单用户模式下执行(sp_dboption 'db_name', 'single user', 'true'),将true改成false就又变成多用户了exec sp_msforeachtable "dbcc checktable('?',repair_rebuild)"