如下解决了五个问题
1. 清空数据
2. 有外键也可以, 因为是逆向删除, 从最后一张表删除. 且使用的是delete, 因为truncate不能对有外键的表
3. 种子问题, 如果表存在种子重设为0, 如不存在就不操作
4. 加了事务, 中间报错, 有后悔机会
5. 截断日志功能, 因为使用delete, 删除后日志文件会增大, 可以不使用
- if( object_id('pr_DataClear') is not null )
- drop procedure pr_DataClear
- go
- create procedure pr_DataClear
- as
- begin transaction
- declare @cTblName varchar(128)
- declare cur_Clear cursor for select rtrim(name) from sysobjects where type = 'U' order by crdate desc
- open cur_Clear
- declare @cSQL varchar(255)
- fetch next from cur_Clear into @cTblName
- while( @@fetch_status = 0)
- begin
- set @cSQL = 'delete from ' + @cTblName
- print @cSQL
- exec( @cSQL )
- if( ident_seed(@cTblName) is not null )
- begin
- dbcc checkident( @cTblName, reseed, 0 )
- print '有种子且成功重置为1'
- end
- fetch next from cur_Clear into @cTblName
- end
- close cur_Clear
- deallocate cur_Clear
- commit
- go
- -- 清空所有表数据
- exec pr_DataClear
- -- 截断日志
- backup log LZ的数据库 with no_log
- dbcc shrinkdatabase( LZ的数据库 )
- dbcc updateusage( LZ的数据库 )
- -- 查看表空间(概数)
- select object_name(id) as 表名, (rtrim(8*reserved/1024) + 'MB') as 总量, (rtrim(8*dpages/1024) + 'MB') as 已使用,
- (rtrim(8*(reserved-dpages)/1024) + 'MB') as 未使用, (rtrim(8*dpages/1024-rows/1024*minlen/1024) + 'MB' ) as 空隙
- from sysindexes
- where indid=1
- order by reserved desc
原文出处:http://topic.csdn.net/u/20090816/17/EE0FA21E-8616-4236-A9CB-8C5A3D45C9D9.html 中45楼
对于有外键约束的表,网上普遍说的方法:
EXEC sp_MSForEachTable ' ALTER TABLE ? NOCHECK CONSTRAINT ALL ' -- NOCHECK Const
EXEC sp_MSForEachTable ' truncate TABLE ? '
EXEC sp_MSForEachTable ' ALTER TABLE ? CHECK CONSTRAINT ALL ' -- NOCHECK Constraints 是行不通的,因为 trun cate不能对有外键的表 ,改为delete from tablename就行,但delete会激活触发器,这也是一个问题。