清空SQL Server数据库中所有表数据的方法

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

  也许很多读者朋友都经历过这样的事情:要在开发数据库基础上清理一个空库,但由于对数据库结构缺乏整体了解,在删除一个表的记录时,删除不了,因为可能有外键约束,一个常见的数据库结构是一个主表,一个子表,这种情况下一般都得先删除子表记录,再删除主表记录。

  说道删除数据记录,往往马上会想到的是delete和truncate语句,但在遇到在两个或多个表之间存在约束的话,这两个语句可能都会失 效,而且最要命的是这两个命令都只能一次操作一个表。那么真正遇到要删除SQL Server数据库中所有记录时,该怎么办呢?有两个选择:

  1.按照先后顺序逐个删除,这个方法在表非常多的情况下显得很不现实,即便是表数量不多,但约束比较多时,你还是要花费大量的时间和精力去研究其间的约束关系,然后找出先删哪个表,再删哪个表,最后又删哪个表。

  2.禁用所有约束,删除所有数据,最后再启用约束,这样就不用花时间和精力去研究什么约束了,只需要编写一个简单的存储过程就可以自动完成这个任务。

CREATE PROCEDURE sp_DeleteAllData
AS
EXEC sp_MSForEachTable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL'
EXEC sp_MSForEachTable 'ALTER TABLE ? DISABLE TRIGGER ALL'
EXEC sp_MSForEachTable 'DELETE FROM ?'
EXEC sp_MSForEachTable 'ALTER TABLE ? CHECK CONSTRAINT ALL'
EXEC sp_MSForEachTable 'ALTER TABLE ? ENABLE TRIGGER ALL'
EXEC sp_MSFOREACHTABLE 'SELECT * FROM ?'
GO

从这两个选择中不难看出第二个选择是最简单有效的了,那么在使用第二个选择时,具体该怎么实施呢?

  首先得编写代码循环检查所有的表,这里我推荐一个存储过程sp_MSForEachTable,因为在微软的官方文档中没有对这个存储过程有描 述,很多开发人员也许都还未曾听说,所以你在互联网上搜索得到的解决办法大多很复杂,也许有的人会认为,既然没有官方文档,这个存储过程可能会不稳定,打 心理上会排斥它,但事实并非如此。下面来先看一个完整的脚本:

  这个脚本创建了一个命名为sp_DeleteAllData的存储过程,前面两行语句分别禁用约束和触发器,第三条语句才是真正地删除所有数 据,接下里的语句分别还原约束和触发器,最后一条语句是显示每个表中的记录,当然这条语句也可以不要,我只是想确认一下是否清空了所有表而已。

  你可以在任何数据库上运行这个存储过程,当然不要在生成数据库上运行,可别怪我没告诉你!不管怎样,还是先备份一下数据库,使用备份数据库还原,然后再运行该存储过程,呵呵,即使是一个大型数据库,也要不多长时间,你的数据库就成一个空库了

转载于:https://www.cnblogs.com/tonykan/p/3439685.html

清空SQL Server数据库中所有表数据的方法(转)相关推荐

  1. SQL Server数据库中批量导入数据的四种方法总结

    在软件项目实施的时候,数据导入一直是项目人员比较头疼的问题.其实,在SQL Server中集成了很多成批导入数据的方法.有些项目实施顾问头疼的问题,在我们数据库管理员眼中,是小菜一碟.现在的重点就是, ...

  2. SQL Server数据库中批量导入数据

    在软件项目实施的时候,数据导入一直是项目人员比较头疼的问题.其实,在SQL Server中集成了很多成批导入数据的方法.有些项目实施顾问头疼的问题,在我们数据库管理员眼中,是小菜一碟.现在的重点就是, ...

  3. SQL Server数据库中超级管理员账号保护方法

    提到sa弱口令,我们首先就会想到,许多数据库都有1个类 似的超级管理员账号,比如:Oracle是"system"和"sys",Sybase也是"sa& ...

  4. SQL Server数据库中所有表及字段信息

    程序思想:用SELECT name From sysobjects WHERE xtype = 'u'得到所有表,然后循环打开表,根据Rs_Colums.Fields(I).Name 得到字段名,Fi ...

  5. 统计sql server数据库中所有表的记录数

    因工作需要查看库里每个表中的记录数,逐表查询太辛苦,故写一过程处理如下: --基本思路为:到系统表查出表名:然后逐表构造sql语句,查询记录数并插入临时表 --创建临时表,保存数据    create ...

  6. SQL Server数据库中的T-SQL如果存在语句概述

    This article walks through different versions of the T-SQL IF EXISTS statement for the SQL database ...

  7. 从sqlserver中数据写入mysql_[SQL Server]SQL Server数据库中如何返回INSERT INTO语句插入/写入数据后的记录值(比如ID等)?...

    问题描述 SQL Server数据库中,有时候当我们使用INSERT INTO语句写入数据后,需要返回写入数据对应的自增ID或者GUID,以便根据此记录进行后续的操作.那么SQL语句如何实现返回记录值 ...

  8. 通过VB向SQL Server数据库中录入数据

    Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) 一.数据录入 通过VB向SQL Se ...

  9. 如何对两个大型SQL Server数据库中的数据进行快速估计比较,以查看它们是否相等

    Bringing impactful analysis into a data always comes with challenges. In many cases, we rely on auto ...

最新文章

  1. 好物推荐 | 直男の送礼指南(下周七夕,欲买从速
  2. guava-cache设计与实现
  3. 可以看游资的app_跟随一线游资操作,轻松收获涨停板
  4. 一款可视化的在线制作H5
  5. python自定义变量名标识符,【python】3 标识符和关键字
  6. VLOOKUP模糊匹配的妙用
  7. 档案盒正面标签制作_如何制作差异化的短视频内容?
  8. svn: Commit failed (details follow): svn: Authorization failed
  9. Spring在Web中的应用
  10. mysql MyISAM和InnoDB
  11. android微信卡,微信无响应怎么弄 让别人微信卡死的小技巧(PC/安卓适用)
  12. python模拟登录注册知网
  13. 数据采集时总提示未登录_做电商必须学会这一招!教你用爬虫工具免费采集网易考拉商品数据...
  14. Linux启动流程之ROM-CODE
  15. 计算机报名怎么老是密码错误,中考报名显示密码错误 中考网上报名说我密码错误怎么办...
  16. 通过使用ZooKeeper解决单点故障理论
  17. 我写的书:《C++,挑战编程——程序设计竞赛进阶训练指南》
  18. 山东省出台《意见》配置公共体育设施
  19. mysql int 可以是负数吗_int型包括负数吗
  20. 你的网站安全吗?ZAP应用实例

热门文章

  1. 数据结构利器之私房STL(上)
  2. springMVC之Interceptor拦截器
  3. 设计模式之建造者模式(01)
  4. 红薯因 Swift 重写开源中国失败,貌似欲改用 Python
  5. 关于 调用 JNI JAR java 的说明和注意事项,调用第 靠写不下了
  6. Android studio 签名使用转
  7. 基于jQuery可悬停控制图片轮播代码
  8. Alibaba Dubbo框架同步调用原理分析-1
  9. Remove Duplicates from Sorted List
  10. C++ 中内存分配和回收