删除数据库中所有表的存储数据
----同时不改变表的结构
方法1:delete
delete from [表的名字]
delete from [表的名字]
delete语句每次删除一行,并在事物中为所删除的每一行做记录,所以delete可以回滚,操作可以撤销。
假如表中有自增序列(从1开始自增1),一共有3条数据,先delete三行再添加一行,那么现在自增序列的将是4。
方法2:truncate
truncate Table.[dbo].[表的名字]
truncate方法可以删除数据,保留表的结构。
truncate是DDL语言,将被隐式提交,不调用rollback(回滚)命令,因而也无法撤销。
truncate将重新设置高水平线和所有索引,在对整个表和索引进行浏览时,经过truncate操作后的表比delete操作后的表要快得多。
truncate不能触发delete出触发器。
truncate清空表中数据之后,将重新设置成初始大小,而delete不能。
truncate不能清空父表。
假如表中有自增序列(从1开始自增1),一共有3条数据,先truncate再添加一行,那么现在自增序列的将是1。
方法3:利用游标
delete和truncate只能一个表一个表的删除,方法3利用游标遍历数据库中所有表,逐个删除。
use [数据库的名字]
declare @tablename varchar(max) delete删除表格还是内容
declare havetable cursor for select [name] from sysobjects where xtype='U' //声明游标
open havetable //打开游标
fetch next from havetable into @tablename //移动游标到第一个数据表
WHILE @@FETCH_STATUS = 0 //循环条件
begin
exec('delete from '+ @tablename) //或者用truncate
fetch next from havetable into @tablename //移动游标到下一个数据表
end
close havetable //关闭游标
deallocate havetable //释放游标
DUMP TRANSACTION [数据库名字] WITH NO_LOG //选择性添加此命令
方法4:执行微软自带的系统存储过程
该方法最简单有效,请使用前先备份数据库,以免造成损失。
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 ?' //或改为'truncate TABLE ?'
EXEC sp_MSForEachTable 'ALTER TABLE ? CHECK CONSTRAINT ALL' //启用
EXEC sp_MSForEachTable 'ALTER TABLE ? ENABLE TRIGGER ALL' //启用触发器
EXEC sp_MSFOREACHTABLE 'SELECT * FROM ?' //验证
GO
EXEC sp_DeleteAllData
GO
注:执行存储过程注意释放,可能比较占用内存,也可以不按照存储过程执行,直接执行几条EXEC语句。
也许很多读者朋友都经历过这样的事情:要在开发数据库基础上清理一个空库,但由于对数据库结构缺乏整体了解,在删除一个表的记录时,删除不了,因为可能有外键约束,一个常见的数据库结构是一个主表,一个子表,这种情况下一般都得先删除子表记录,再删除主表记录。
说道删除数据记录,往往马上会想到的是delete和truncate语句,但在遇到在两个或多个表之间存在约束的话,这两个语句可能都会失效,而且最要命的是这两个命令都只能一次操作一个表。那么真正遇到要删除SQL Server数据库中所有记录时,该怎么办呢?有两个选择:
1.按照先后顺序逐个删除,这个方法在表非常多的情况下显得很不现实,即便是表数量不多,但约束比较多时,你还是要花费大量的时间和精力去研究其间的约束关系,然后出先
删哪个表,再删哪个表,最后又删哪个表。
2.禁用所有约束,删除所有数据,最后再启用约束,这样就不用花时间和精力去研究什么约束了,只需要编写一个简单的存储过程就可以自动完成这个任务。
从这两个选择中不难看出第二个选择是最简单有效的了,这就是本方法的主体思路。 编写代码循环检查所有的表,这里推荐一个存储过程sp_MSForEachTable。
注:所有内容汇总自网络。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论