数据库中被插入了很多脏数据,想要一个一个找出来删除,简直如大海捞针。在数据库的有用数据有备份的情况下,可以采取先删除所有表的数据,使其成为光有框架的数据库,然后恢复备份数据。
那怎样才能删除全部数据呢? 逐个表删必须遇到外键约束一和触发器等各种麻烦。显然,可以在删除表前,解除外键约束和触发器。且看下面sql语句。
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'
sp_MSForEachTable 是微软系统数据库未曾公开的一个存储过程,另有一个为sp_MSforeachdb。
上面的第一,二条语句分别用来解除约束和禁用触发器,第三条为删除所有数据表中的数据,第四,五条则是恢复约束和触发器。
把以上语句写成系统存储过程。
USE MASTER
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'
GO
参考资料:
1. http://www.knowsky.com/541311.html
2. http://hi.baidu.com/windy8848/blog/item/f814b57e25fb77300cd7daef.html