我们都知道,如果是清空数据库中所有表的数据的,那比较好办,只要利用系统表sys.tables查询出数据库中所有表信息,然后再用游标循环清空就好了,附SQL语句如下:
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-指定表是否为基础数据表
……
其它字段,请大家根据自己的需要添加
然后我们将所有表的信息添加到表中(此步骤虽然烦琐,但为了以后的快速调用,现在烦琐点也是值得的),然后,我们写一个存储过程来清空指定数据。
/*
创建时间:2011-10-11
功能:清除所有指定表的数据
创建人:程序食堂
http://www.lmwlove.com
*/
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
现在,我们任意时候想清空指定表数据时,执行该存储过程即可。