`
gaojin
  • 浏览: 44147 次
  • 性别: Icon_minigender_1
  • 来自: 湖北
社区版块
存档分类
最新评论

详解SQL Server的两个存储过程:sp_MSforeachtable/sp_MSforeachdb

    博客分类:
  • SQL
阅读更多

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.


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sxycgxj/archive/2007/01/27/1495568.aspx

分享到:
评论

相关推荐

    系统存储过程sp_MSforeachtable和sp_MSforeachdb使用说明

    系统存储过程`sp_MSforeachtable`和`sp_MSforeachdb`是SQL Server中非常实用的工具,主要用于批量处理数据库中的表或所有数据库。这两个存储过程是Microsoft SQL Server自6.5版本以来内置的非公开存储过程,它们位于...

    Sql Server中清空所有数据表中的记录

    Sql Server中清空所有...为什么我还要多此一举呢,一是我这里介绍的是删除数据库的所有数据,因为数据之间可能形成相互约束关系,删除操作可能陷入死循环,二是这里使用了微软未正式公开的sp_MSForEachTable存储过程。

    SqlServer删除所有表数据语句

    首先,我们需要创建一个存储过程 `sp_DeleteAllData`,该过程将删除所有表的数据。该过程的实现代码如下: ```sql CREATE PROCEDURE sp_DeleteAllData AS EXEC sp_MSForEachTable 'ALTER TABLE ? NOCHECK ...

    浅析SQL SERVER一个没有公开的存储过程

    SQL Server中的`sp_MSforeachtable`是一个非常实用但未公开的系统存储过程,它允许DBA(数据库管理员)执行对所有用户表或特定表的批量操作,极大地简化了数据库维护和管理的工作。这个存储过程从SQL Server 6.5版本...

    SQL Server数据表和数据库

    本文介绍了master数据库中两个非常有用的存储过程:sp_MSForEachDB和sp_MSForEachTable。

    SQL2005遍历系统所有表及库的存储过程

    本文中提到的两个存储过程`sp_MSforeachtable`和一个自定义过程都是用于遍历数据库或表并执行特定操作的有效手段。 ### `sp_MSforeachtable` `sp_MSforeachtable`是SQL Server提供的一种非官方系统存储过程,它...

    如何对SQL数据表和数据库进行迭代操作

    本文主要讨论了两个不常出现在SQL Server在线教科书中的系统存储过程:`sp_MSForEachDB`和`sp_MSForEachTable`,它们能帮助我们更加便捷地处理数据库的管理和维护任务。 `sp_MSForEachDB`是用于迭代服务器上所有...

    SQLSERVER2000一些内置存储过程用法和说明

    10. **sp_MSforeachdb**: 在服务器上的每个数据库上运行指定的 T-SQL 语句。 - 用法示例:`EXEC sp_MSforeachdb @command1 = 'USE ?; SELECT db_name()'` #### 四、防止 SQL 注入的最佳实践 为了有效防止 SQL 注入...

    SQL Server将数据导出SQL脚本的方法

    这时,可以使用存储过程,例如`sp_msforeachtable`,这个系统存储过程可以遍历所有表并生成插入脚本。但请注意,`sp_msforeachtable`不是官方支持的,可能在未来的SQL Server版本中被移除。 下面是一个使用`sp_...

    Sql Server强制清空所有数据表中的记录.docx

    请注意,这种方法可能会有潜在风险,因为它涉及全局系统存储过程`sp_MSForEachTable`,这不是一个官方支持的SQL Server组件,尽管在许多情况下它是有效的。另外,禁用所有触发器可能导致数据一致性问题,如果这些...

    批量更改数据库表的所有者

    `sp_MSforeachtable`是一个非文档化的存储过程,主要用于遍历数据库中的所有表,并对每张表执行相同的SQL语句。它可以极大地简化批处理任务。使用格式如下: ```sql EXEC sp_MSforeachtable @command1 = N'your SQL...

    SqlServer常用SQL

    '"` 这个命令会遍历数据库中的每一个表,并调用`sp_spaceused`存储过程,显示每个表的大小、已使用的空间以及空闲空间。 4. **Sysobject的xtype列的含义**: - d: 默认值 - f: 外键 - l: 日志 - fn: 标量函数 ...

    用SQL语句完成SQL Server数据库的修复

    这里`sp_msforeachtable`是一个系统存储过程,它可以遍历数据库中的所有表,并执行指定的命令。`@command1`参数指定了要执行的命令。 ##### 4. 恢复多用户模式 修复完成后,需要将数据库恢复为多用户模式: ```...

    Sql Server强制清空所有数据表中的记录.pdf

    这里提供了一个名为`PROC_DeleteAllData`的存储过程,它能够帮助我们安全地清空SQL Server数据库中的所有数据。 首先,我们来看存储过程的各个部分: 1. **关闭约束**: 使用`sp_MSForEachTable`系统存储过程遍历...

    手工sql注入

    xp_cmdshell 是一个扩展存储过程,允许从 SQL Server 中执行操作系统命令。攻击者可以使用 xp_cmdshell 来执行恶意命令,例如添加用户、更改权限、执行系统命令等。 2.SQL 权限控制: 在 SQL Server 中,有多种...

    使用SQL语句清空数据库所有表的数据.docx

    然而,由于`sp_msforeachtable`是非标准的扩展存储过程,微软并不建议在生产环境中广泛使用,因为它可能在未来的SQL Server版本中被弃用。 总结来说,清空数据库所有表数据的SQL方法主要有三种:直接拼接字符串执行...

    sqlserver 常用存储过程集锦

    本篇将详细讲解文中提到的几个常用存储过程,以及一些与之相关的SQL Server存储过程知识。 1. 分页查找数据:存储过程`[dbo].[GetRecordSet]` 这个存储过程用于实现分页查询,它是数据库应用中常见的需求。通过...

Global site tag (gtag.js) - Google Analytics