欢迎来到.net学习网

欢迎联系站长一起更新本网站!QQ:879621940

您当前所在位置:首页 » Sql随手笔记 » 正文

热门阅读

清空SQL SERVER数据库中所有指定表中数据的解决方案

创建时间:2011年10月11日 16:52  阅读次数:(7158)
分享到:

我们都知道,如果是清空数据库中所有表的数据的,那比较好办,只要利用系统表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

现在,我们任意时候想清空指定表数据时,执行该存储过程即可。
来源:.net学习网
说明:所有来源为 .net学习网的文章均为原创,如有转载,请在转载处标注本页地址,谢谢!
【编辑:

打赏

取消

感谢您的支持,我会做的更好!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

最新评论

共有评论0条
  • 暂无任何评论,请留下您对本文章的看法,共同参入讨论!
发表评论:
留言人:
内  容:
请输入问题 43+23=? 的结果(结果是:66)
结  果: