清空SQL Server数据库中所有表数据的方法(转)
清空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数据库中所有表数据的方法(转)相关推荐
- SQL Server数据库中批量导入数据的四种方法总结
在软件项目实施的时候,数据导入一直是项目人员比较头疼的问题.其实,在SQL Server中集成了很多成批导入数据的方法.有些项目实施顾问头疼的问题,在我们数据库管理员眼中,是小菜一碟.现在的重点就是, ...
- SQL Server数据库中批量导入数据
在软件项目实施的时候,数据导入一直是项目人员比较头疼的问题.其实,在SQL Server中集成了很多成批导入数据的方法.有些项目实施顾问头疼的问题,在我们数据库管理员眼中,是小菜一碟.现在的重点就是, ...
- SQL Server数据库中超级管理员账号保护方法
提到sa弱口令,我们首先就会想到,许多数据库都有1个类 似的超级管理员账号,比如:Oracle是"system"和"sys",Sybase也是"sa& ...
- SQL Server数据库中所有表及字段信息
程序思想:用SELECT name From sysobjects WHERE xtype = 'u'得到所有表,然后循环打开表,根据Rs_Colums.Fields(I).Name 得到字段名,Fi ...
- 统计sql server数据库中所有表的记录数
因工作需要查看库里每个表中的记录数,逐表查询太辛苦,故写一过程处理如下: --基本思路为:到系统表查出表名:然后逐表构造sql语句,查询记录数并插入临时表 --创建临时表,保存数据 create ...
- SQL Server数据库中的T-SQL如果存在语句概述
This article walks through different versions of the T-SQL IF EXISTS statement for the SQL database ...
- 从sqlserver中数据写入mysql_[SQL Server]SQL Server数据库中如何返回INSERT INTO语句插入/写入数据后的记录值(比如ID等)?...
问题描述 SQL Server数据库中,有时候当我们使用INSERT INTO语句写入数据后,需要返回写入数据对应的自增ID或者GUID,以便根据此记录进行后续的操作.那么SQL语句如何实现返回记录值 ...
- 通过VB向SQL Server数据库中录入数据
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) 一.数据录入 通过VB向SQL Se ...
- 如何对两个大型SQL Server数据库中的数据进行快速估计比较,以查看它们是否相等
Bringing impactful analysis into a data always comes with challenges. In many cases, we rely on auto ...
最新文章
- 好物推荐 | 直男の送礼指南(下周七夕,欲买从速
- guava-cache设计与实现
- 可以看游资的app_跟随一线游资操作,轻松收获涨停板
- 一款可视化的在线制作H5
- python自定义变量名标识符,【python】3 标识符和关键字
- VLOOKUP模糊匹配的妙用
- 档案盒正面标签制作_如何制作差异化的短视频内容?
- svn: Commit failed (details follow): svn: Authorization failed
- Spring在Web中的应用
- mysql MyISAM和InnoDB
- android微信卡,微信无响应怎么弄 让别人微信卡死的小技巧(PC/安卓适用)
- python模拟登录注册知网
- 数据采集时总提示未登录_做电商必须学会这一招!教你用爬虫工具免费采集网易考拉商品数据...
- Linux启动流程之ROM-CODE
- 计算机报名怎么老是密码错误,中考报名显示密码错误 中考网上报名说我密码错误怎么办...
- 通过使用ZooKeeper解决单点故障理论
- 我写的书:《C++,挑战编程——程序设计竞赛进阶训练指南》
- 山东省出台《意见》配置公共体育设施
- mysql int 可以是负数吗_int型包括负数吗
- 你的网站安全吗?ZAP应用实例