保存数据库中其他对象不变,删除数据库中所有数据的实现方法

转载 2006年06月20日 20:24:00

原帖内容:
怎样把数据库中所有数据删除,然后把所有的自动增量复位?
表太多,无法手工完成。
http://community.csdn.net/Expert/topic/3094/3094555.xml?temp=.2920954

/*
--原本打算这样
--先禁用所有外键约束
exec sp_msforeachtable "alter table ? nocheck CONSTRAINT all"
--然后删除数据
exec sp_msforeachtable "truncate table ?"
--再启用所有外键约束
exec sp_msforeachtable "alter table ? check constraint all"
--但是禁用了以后,truncate table 不行,会提示冲突
*/

--现在我的想法是(语句待优化):

--第一部分,生成建立外键的语句保存到#tmp
declare @name varchar(200),@tmp1 varchar(500),@tmp2 varchar(500)

create table #tmp
(
string varchar(8000)
)

SELECT  表名称=object_name(b.fkeyid)
 ,外键名称=a.name
 ,引用的列名=(SELECT name FROM syscolumns WHERE colid=b.fkey AND id=b.fkeyid)
 ,引用的表名=object_name(b.rkeyid)
 ,已引用的列名=(SELECT name FROM syscolumns WHERE colid=b.rkey AND id=b.rkeyid)
into #t FROM sysobjects a
 join sysforeignkeys b on a.id=b.constid
 join sysobjects c on a.parent_obj=c.id
where a.xtype='f' AND c.xtype='U'

declare cur_test cursor for
 select a.name from sysobjects a join sysobjects c on a.parent_obj=c.id where a.xtype='f' and c.xtype='U'
open cur_test
FETCH NEXT FROM cur_test INTO @name
WHILE (@@fetch_status <> -1)
BEGIN
 IF (@@fetch_status <> -2)
 BEGIN
  select @tmp1='',@tmp2=''
  select @tmp1=@tmp1+'['+引用的列名+'],',@tmp2=@tmp2+'['+已引用的列名+'],' from #t where 外键名称=@name
  insert into #tmp select top 1 'ALTER TABLE [DBO].['+表名称+'] ADD CONSTRAINT ['+@name+'] FOREIGN KEY ( '+left(@tmp1,len(@tmp1)-1)+' ) REFERENCES ['+引用的表名+'] ( '+left(@tmp2,len(@tmp2)-1)+' )' from #t where 外键名称=@name
 END
 FETCH NEXT FROM cur_test INTO @name
END

CLOSE cur_test
DEALLOCATE cur_test
drop table #t

--第二部分,删除所有外键
DECLARE @STRING VARCHAR(8000)
WHILE EXISTS(SELECT NAME FROM SYSOBJECTS WHERE TYPE='F')
BEGIN
 SELECT @STRING='ALTER TABLE '+B.NAME+' DROP CONSTRAINT '+A.NAME+CHAR(13)
  FROM (SELECT PARENT_OBJ,NAME FROM SYSOBJECTS WHERE TYPE='F') A,
        (SELECT ID,NAME FROM SYSOBJECTS WHERE OBJECTPROPERTY(ID, N'ISUSERTABLE') = 1) B
    WHERE A.PARENT_OBJ=B.ID
 EXEC(@STRING)
END

--第三部分,删除所有表的记录,并且把identity复位
exec sp_msforeachtable "truncate table ?"

--第4部分,执行#tmp里面的建立外键的语句,恢复外键
declare cur_test2 cursor for select string from #tmp

open cur_test2
FETCH NEXT FROM cur_test2 INTO @string
WHILE (@@fetch_status <> -1)
BEGIN
 IF (@@fetch_status <> -2)
 BEGIN
  exec(@string)
  PRINT @STRING
 END
 FETCH NEXT FROM cur_test2 INTO @string
END

CLOSE cur_test2
DEALLOCATE cur_test2

drop table #tmp

保存数据库中其他对象不变,删除数据库中所有数据的实现方法

原帖内容:怎样把数据库中所有数据删除,然后把所有的自动增量复位?表太多,无法手工完成。http://community.csdn.net/Expert/topic/3094/3094555.xml?t...
  • Swanzy
  • Swanzy
  • 2006年04月14日 16:43
  • 858

保存中其他对象不变,删除数据库中所有数据的实现方法

  • zgqtxwd
  • zgqtxwd
  • 2008年04月27日 05:11
  • 165

一次性删除Mysql数据库中所有表的数据,保留表结构

通过sql命令的方式生成所有的truncate语句并写入到.sql脚本文件中,然后执行脚本即可完成删除操作,并且保留了表结构。...
  • li_qinging
  • li_qinging
  • 2017年05月22日 10:00
  • 1853

清除指定数据库中所有表的记录

 除指定数据库中所有表的记录,就是要一个空的数据库。方法如下:一:SQL中delete 与 truncate table 的比较 delete 适用于限定范围的删除,例如: delete titles...
  • jwdream2008
  • jwdream2008
  • 2009年11月03日 12:16
  • 3180

删除数据库中所有表中指定的字段

– 更精确的查询SELECT obj.name FROM SysObjects obj LEFT JOIN syscolumns col ON col.id = obj.id WHERE obj....
  • wl076
  • wl076
  • 2016年08月25日 11:45
  • 973

GreenDao清空数据库的方法

最近在做项目的时候,为了方便测试人员测试,在应用中加入正式库和测试库切换的功能。为了防止正式库和测试库切换带来的数据冲突,切换的时候必须把当前的数据库清空。代码如下:package com.examp...
  • wanglaohushiwo
  • wanglaohushiwo
  • 2017年09月20日 08:12
  • 1016

SQL Serverl删除数据库中所有表与数据语句

如果要删除数据表中所有数据只要遍历一下数据库再删除就可以了,清除所有数据我们可以使用搜索出所有表名,构造为一条SQL语句进行清除了,这里我一一给各位同学介绍。 使用sql删除数据库中所有...
  • ycl295644
  • ycl295644
  • 2015年06月18日 14:59
  • 5723

symfony2实现从数据库获取数据的方法

假设有一张表:test,字段:name,color 有两条记录:Tom blue                          Lily red 1        $conn=$this-...
  • wang19yan89
  • wang19yan89
  • 2017年02月07日 15:59
  • 269

mvc中实现删除数据库表中的所有数据

//执行sql语句删除表中数据,dbo.Grade string deleteSql = "TRUNCATE TABLE dbo.Grade";
  • liuwen718
  • liuwen718
  • 2014年05月27日 16:41
  • 960

【Hibernate】保存对象到数据库

【Hibernate】保存对象到数据库,实现事务
  • u010096526
  • u010096526
  • 2016年01月17日 22:46
  • 2220
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:保存数据库中其他对象不变,删除数据库中所有数据的实现方法
举报原因:
原因补充:

(最多只允许输入30个字)