我们都知道,如果是清空数据库中所有表的数据的,那比较好办,只要利用系统表sys.tables查询出数据库中所有表信息,然后再用游标循环清空就好了,附SQL语句如下:
1 2 3 4 5 6 7 8 9 10 11 |
declare @tbname varchar(255) declare #tb cursor for select name from sys.tables open #tb fetch next from #tb into @tbname while @@fetch_status=0 begin exec('delete from ['+@tbname+']') fetch next from #tb into @tbname end close #tb deallocate #tb |
有关sys.tables的用法,请参考本站:
利用SQL语句查询数据库中所有表
但有时候我们是要有选择性的清空某些表信息,小编最近就遇到这种情况,我只需清空小编负责的ERP系统中的所有业务流程数据,而基础信息与系统配置信息是不能被清除的,怎么办呢?为了达了快速与重复利用的目的,小编把自己的解决方案附下:
先创建一个配置表,表名为:Sys_TableExtendedProperties
表字段如下:
TableName-存储系统中所有表的表名
IsSystem-指定表是否为系统表
IsBaseInformation-指定表是否为基础数据表
……
其它字段,请大家根据自己的需要添加
然后我们将所有表的信息添加到表中(此步骤虽然烦琐,但为了以后的快速调用,现在烦琐点也是值得的),然后,我们写一个存储过程来清空指定数据。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 |
/* 创建时间:2011-10-11 功能:清除所有指定表的数据 创建人:程序食堂 */ create procedure ClearDate @sourcetype int as set nocount on declare @TableName varchar(128) declare @T_Table table(TableName varchar(128) not null) --获取要删除数据的表 if(sourcetype=1) --如果sourcetype=1,删除所有系统数据 begin insert into @T_Table(TableName) select name from sys.tables where exists(select * from Sys_TableExtendedProperties where Sys_TableExtendedProperties.TableName = sys.tables.name and Sys_TableExtendedProperties.IsSystemTable = 1) order by name end else if(sourcetype=2) --如果sourcetype=2,删除所有基础数据 begin insert into @T_Table(TableName) select name from sys.tables where exists(select * from Sys_TableExtendedProperties where Sys_TableExtendedProperties.TableName = sys.tables.name and Sys_TableExtendedProperties.IsBaseInformation = 1) order by name end else --如果sourcetype等于其它值,删除所有业务数据 begin insert into @T_Table(TableName) select name from sys.tables where exists(select * from Sys_TableExtendedProperties where Sys_TableExtendedProperties.TableName = sys.tables.name and Sys_TableExtendedProperties.IsSystemTable = 0 and Sys_TableExtendedProperties.IsBaseInformation = 0) order by name end while exists(select * from @T_Table) begin --随机取表名 select top 1 @TableName = TableName from @T_Table order by newid() begin try --尝试清除表数据 if not exists(select * from sysforeignkeys where object_name(rkeyid)=@TableName) begin exec('truncate table '+@TableName) end else begin --删除表数据(如果有触发器,先关闭触发器) --禁用与启用触发器,请参见本站: 利用Sql禁用与启用触发器 exec('alter table '+@TableName + ' disable trigger all delete from '+@TableName + ' alter table '+@TableName + ' enable trigger all') --有自增栏位 if exists(select * from syscolumns where id = object_id(@TableName) and colstat = 1) begin --将自增栏位当前标识值置为0 DBCC CHECKIDENT (@TableName, RESEED, 0) end end delete @T_Table where TableName = @TableName end try begin catch end catch end |
现在,我们任意时候想清空指定表数据时,执行该存储过程即可。
转自:http://www.lmwlove.com/ac/ID637