CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  MS-SQL Server >  疑难问题

高手求救阿!~ 在线等待!~

楼主CrazyWing()2003-12-04 16:48:24 在 MS-SQL Server / 疑难问题 提问

我要对数据库的所有表清空,但遇到一个问题就是表与表之间有主外键关联!~  
  请问我用什么方法能解决.然后把所有的记录清空? 问题点数: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

相关问题

  • 在线等待
  • 在线等待。。。。。。
  • 在线等待
  • 在线等待!
  • 在线等待
  • 在线等待
  • 在线等待!
  • 在线等待
  • 在线等待!
  • 在线等待。。。

关键词

  • 脚本
  • 数据库
  • 选项
  • 文件
  • 选择
  • levelpath
  • sysdepends
  • oname
  • vt
  • objdeppath

得分解答快速导航

  • 帖主:CrazyWing
  • lynx1111
  • CrazyFor
  • CrazyFor
  • pengdali
  • pengdali
  • zjcxc
  • zjcxc

相关链接

  • SQL Server类图书

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo