高手求救阿!~ 在线等待!~
我要对数据库的所有表清空,但遇到一个问题就是表与表之间有主外键关联!~
请问我用什么方法能解决.然后把所有的记录清空?
问题点数:100、回复次数:9Top
1 楼lynx1111(任我行:一个PLMM看着就兴奋的男人)回复于 2003-12-04 16:52:19 得分 0
1。数据库右键--〉生成脚本
2。到入导出--〉导数据库对象--〉取消勾选“复制数据”Top
2 楼lynx1111(任我行:一个PLMM看着就兴奋的男人)回复于 2003-12-04 16:57:38 得分 30
create function udf_GenLevelPath_Table()
returns @v_Result table (LevelPath int,OName sysname,type varchar(8))
/****************************************************************/
/* 功能描述:按照依赖关系,列出数据库对象 */
/* 输入参数:无 */
/* 输出参数:按照依赖关系排列的数据库对象表,无依赖的在前 */
/* 编写:我 */
/* 时间:2003-9-9 */
/****************************************************************/
as
begin
declare @vt_ObjDepPath table (LevelPath int,OName sysname null, type Varchar(8))
declare @vt_Temp1 table (OName sysname null)
declare @vt_Temp2 table (OName sysname null)
declare @vi_LevelPath int
set @vi_LevelPath = 1
insert into @vt_ObjDepPath(LevelPath,OName,type)
select @vi_LevelPath,o.name,o.type
from sysobjects o
where xtype not in ('S','X')
insert into @vt_Temp1(OName)
select distinct object_name(sysdepends.depid)
from sysdepends,@vt_ObjDepPath p
where sysdepends.id <> sysdepends.depid
and p.OName = object_name(sysdepends.id)
while (select count(*) from @vt_Temp1) > 0
begin
set @vi_LevelPath = @vi_LevelPath + 1
update @vt_ObjDepPath
set LevelPath = @vi_LevelPath
where OName in (select OName from @vt_Temp1)
and LevelPath = @vi_LevelPath - 1
delete from @vt_Temp2
insert into @vt_Temp2
select * from @vt_Temp1
delete from @vt_Temp1
insert into @vt_Temp1(OName)
select distinct object_name(sysdepends.depid)
from sysdepends,@vt_Temp2 t2
where t2.OName = object_name(sysdepends.id)
and sysdepends.id <> sysdepends.depid
end
select @vi_LevelPath = max(LevelPath) from @vt_ObjDepPath
update @vt_ObjDepPath
set LevelPath = @vi_LevelPath + 1
where OName not in (select distinct object_name(sysdepends.id) from sysdepends)
and LevelPath = 1
insert into @v_Result
select * from @vt_ObjDepPath order by LevelPath desc
return
end
go
--调用方法
select * from dbo.udf_GenLevelPath_Table() where type='U'
go
原来的函数没有把主键、视图等分开,我把它改写了一下,这样就可以取出你定义的用户表!
然后再用游标处理就好了!
最后的 PROCEDURE 应该这样:
CREATE PROCEDURE sp_ClearUserTable
AS
DECLARE @tablename varchar(50)
DECLARE c_tablename CURSOR FOR
select OName from udf_GenLevelPath_Table() where type='U'
OPEN c_tablename
FETCH NEXT FROM c_tablename INTO @tablename
WHILE @@FETCH_STATUS=0
BEGIN
EXEC('DELETE ' + @tablename )
FETCH NEXT FROM c_tablename INTO @tablename
END
CLOSE c_tablename
DEALLOCATE c_tablename
Top
3 楼CrazyFor(冬眠的鼹鼠)回复于 2003-12-04 18:05:30 得分 10
数据库->右键->所有任务->生成SQL脚本.
看看选项,把你要的选项选中,比如索引等.
删除数据,
再用刚才的脚本新建一个库就完了.
Top
4 楼CrazyFor(冬眠的鼹鼠)回复于 2003-12-04 18:05:47 得分 10
数据库->右键->所有任务->生成SQL脚本.
看看选项,把你要的选项选中,比如索引等.
删除数据库,
再用刚才的脚本新建一个库就完了.Top
5 楼pengdali()回复于 2003-12-04 18:21:19 得分 10
while exists(select 1 from sysobjects a join sysindexes b on a.xtype='U' and a.status>0 and a.id=b.id and b.indid<2 and b.rows>0)
exec sp_MSForEachTable 'delete table ?'
--会报错,但你让它报。Top
6 楼pengdali()回复于 2003-12-04 18:24:15 得分 10
是这个:
while exists(select 1 from sysobjects a join sysindexes b on a.xtype='U' and a.status>0 and a.id=b.id and b.indid<2 and b.rows>0)
exec sp_MSForEachTable 'delete ?'Top
7 楼laurecn(每天努力多一点)回复于 2003-12-04 19:23:46 得分 0
学习...Top
8 楼zjcxc(邹建)回复于 2003-12-05 08:23:35 得分 15
最安全的办法:
sql200企业管理器
--右键要导出的数据库
--所有任务
--生成SQL脚本
--<常规>里选择"生成全部对象脚本"","在脚本文件中包含说明性标题"选上
--<设置格式>里,将"包含扩展属性",选上
--<选项>中,将"表脚本选项"中的内容全部选择上
--<选项>中,"安全性选项"是决定是否要包含创建数据库及用户权限等的设置,根据你的需要选择
--其他所有的选项保持默认值
--然后确定,将其保存成一个.sql文件
Top
9 楼zjcxc(邹建)回复于 2003-12-05 08:24:34 得分 15
特别说明:
--<选项>中,将"安全性选项"全部选上.
然后删除你的数据库.
在查询分析器中打开上面的脚本文件,按F5执行.
Top




