CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  MS-SQL Server >  基础类

关于存储过程,紧急求助!!!!

楼主lubj(软件小菜鸟)2000-11-07 23:31:00 在 MS-SQL Server / 基础类 提问

请问各位大虾:  
  在写存储过程时若出现以下问题该怎么办:  
  定义A表其结构为:  
  父类,子类,其它数据  
  其中当记录a的子类为记录b的父类时则b为a的一个子集  
  如  
  记录a:1   2   ....  
  记录b:2   4   ....  
  则b为a的子集  
  当我要写一个存储过程删除一条记录时首先要删除其所有子集  
  但在用存储过程时同一个名称游标在某一时间只允许存在一个,  
  这样当我在删除如下表所示的数据中记录时我该怎么办:  
  记录1:             1   2   ....  
  记录2:             2   3   ....  
  记录3:             34   ....  
  记录4:             45   ....  
  记录5:             56   ....  
  记录6:             67   ....  
  记录7:             78   ....  
  记录8:             7   9   ....  
  记录8:             7   10   ....  
  ;;;                     ........  
  记录n:               ........      
  望各位不吝指教,注意只允许用存储过程!!! 问题点数:300、回复次数:7Top

1 楼nononono(null,null)回复于 2000-11-08 00:47:00 得分 100

题目有意思,何况这200大洋!我也奋不顾身了,请看:  
   
  CREATE   procedure   [dela]   (@delclass   char(10))   as  
   
  declare   @n   int,   @subclass   char(10)  
   
  select   @n=1  
  while   @n>0  
  begin  
          select   @n=count(*)  
                        from   [tablename]    
                        where   父類=@delclass  
   
          if   @n>0  
          begin  
                  select   top   1   @subclass=子類    
                                from   [tablename]    
                                where   父類=@delclass  
   
                  exec   dela   @subclass  
   
                  delete   from   [tablename]    
                                where   父類=@delclass   and   子類=@subclass  
          end  
  end  
   
  delete   from   [tablename]    
                where   父類=@delclass  
   
  return  
   
   
  Top

2 楼nononono(null,null)回复于 2000-11-08 00:50:00 得分 50

这里用到了存储过程的递归,不知你用的数据库是否允许。  
  这里没有用游标。  
  另外,程序还没有优化,效率可能不高。Top

3 楼nononono(null,null)回复于 2000-11-08 00:55:00 得分 50

才发现:我这里要删的可是指定的一个父类的所有记录。不过,可以再增加一个过程来调用这个过程,以免把一个父类的所有记录全删了(只删一个父类的指定记录)。Top

4 楼nononono(null,null)回复于 2000-11-08 08:54:00 得分 100

再给你一个比较让人担心的非递归算法,你自己加上事务吧。  
   
  CREATE   procedure   [delb]   (@delclass   char(10))   as  
   
  create   table   [#tmptable]   (父類   char(10),子類   char(10))  
   
  declare   @n   int,   @foundfclass   char(10),   @foundsclass   char(10)  
   
  select   @foundfclass=@delclass  
  select   @n=1  
   
  while   @n>0  
  begin  
          insert   into   [#tmptable]    
                        select   父類,子類    
                                      from   [tttt]    
                                      where   父類=@foundfclass  
   
          delete   from   [tttt]    
                        where   父類=@foundfclass  
   
          select   top   1    
                        @foundsclass=父類,   @foundfclass=子類    
                        from   [#tmptable]  
   
          delete   from   [#tmptable]    
                        where   父類=@foundsclass   and   子類=@foundfclass  
   
          select   @n=count(*)    
                        from   [#tmptable]  
  end  
   
  drop   table   [#tmptable]  
   
  return  
   
  Top

5 楼lubj(软件小菜鸟)回复于 2000-11-08 08:55:00 得分 0

这里的删除仅是其中一个操作,关键的是我在做删除前还要做其它相关处理,这样保证数据一致性!  
  这样应必须要用到游标,那我该怎么办呢?Top

6 楼nononono(null,null)回复于 2000-11-08 13:44:00 得分 0

删除前的其它相关处理也应该可以参照这个非递归算法。  
  可以在临时表中使用一个游标。  
  这个非递归算法的结构是可扩充的。你仔细看了我的算法了吗?  
  Top

7 楼lubj(软件小菜鸟)回复于 2000-11-08 22:58:00 得分 0

谢谢!Top

相关问题

  • 紧急问题!有关存储过程!
  • 紧急!!!!怎样在存储过程A里面调用存储过程B??
  • [oracle]紧急+数据窗口数据源用存储过程,oracle中如何定义这个存储过程
  • [紧急求助]我如果在存储过程中实现"创建另一个存储过程"
  • 紧急求救高手。关于oracle存储过程!
  • vb调用带输出参数的存储过程?(紧急)
  • 紧急求助:ORACLE存储过程中动态SQL
  • 紧急求救!存储过程里如何取出结果??
  • 存储过程
  • 存储过程

关键词

  • 存储过程
  • 算法
  • 数据
  • 记录
  • foundfclass
  • delclass
  • tmptable
  • 游标
  • foundsclass
  • 删除

得分解答快速导航

  • 帖主:lubj
  • nononono
  • nononono
  • nononono
  • nononono

相关链接

  • SQL Server类图书

广告也精彩

反馈

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