当前位置:编程学习 > C#/ASP.NET >>

请教高手 有关公交换乘的存储过程,急!谢谢

USE [mybus]
GO
/****** Object:  StoredProcedure [dbo].[sel_s_site]    Script Date: 04/25/2013 20:14:53 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER proc  [dbo].[sel_s_site] 
  @begin   varchar(50),   
  @end   varchar(50)   
  as   
  set   nocount   on   
  declare   @l   int   
  --正向搜索线路   
  set   @l=0   
  --把数据插入临时表   
  select   liname,Line=cast(''+rtrim(liname)   
  +':   '+rtrim(sitename)   as   varchar(4000))   
,sitename,number=number+1,level=@l,gid=1   
  into   #t   from  sili   where   sitename=@begin   
 while   @@rowcount>0   and   not   exists(select   *   from     
  #t  where   sitename = @end)    
  begin   
  set   @l=@l+1   
  
  --把数据插入临时表   
  insert   #t(Line,liname,sitename,number,level,gid)   
  select     
 Line=a.Line+case   
  when   a.liname=b.liname   
  then   '->'+rtrim(b.sitename)   
  else   '   =>   '+rtrim(b.liname)+':   '+rtrim(b.sitename)   
  end,   
  liname=b.liname,sitename=b.sitename,number=b.number+1,   
  @l,   
  case   when   a.liname=b.liname   then   a.gid   else     
  a.gid+1   end   
  from   #t   a,sili   b   
  where   a.level=@l-1   
  and(   
  a.liname=b.liname   and   a.number=b.number   
  or     
  a.sitename=b.sitename   and   a.liname<>b.liname)   
  continue   
  end   
         
  --   如果正向思索存在线路,则选择出来   
  if   exists(select   起点站=@begin  
  ,终点站=@end 
  ,转车次数=gid   
  ,经过站数=case   when   gid<3   then   @l   else   @l-gid+2     
  end   
  ,乘车线路=Line     
  from   #t   where   level=@l   and  sitename = @end)   
    
  begin   
  select   起点站=@begin  
  ,终点站=@end   
  ,转车次数=gid   
  ,经过站数=case   when   gid<3   then   @l   else   @l-gid+2     
  end   
  ,乘车线路=Line     
  from   #t   where   level=@l   and   sitename = @end   
    
  end   
  --如果正向搜索不存在线路,则反向搜索   
  if   not   exists(select   起点站=@begin  
  ,终点站=@end   
  ,转车次数=gid   
  ,经过站数=case   when   gid<3   then   @l   else   @l-gid+2     
  end   
  ,乘车线路=Line    
  from   #t   where   level=@l   and   sitename = @end)   
    
  begin   
    
  --反向搜索线路向搜索线路   
    
    
  set   nocount   on   
    
  set   @l=0   
  select   liname,Line=cast(''+rtrim(liname)   
  +':   '+rtrim(sitename)   as   varchar(4000))   
  ,sitename,number=number-1,level=@l,gid=1   
  into   #m   from   sili  where   sitename=@begin   
  while   @@rowcount>0   and   not   exists(select   *   from     
  #m   where   sitename = @end)    
  begin   
  set   @l=@l+1   
     
  insert   #m(Line,liname,sitename,number,level,gid)   
  select     
 Line=a.Line+case   
  when   a.liname=b.liname   
  then   '->'+rtrim(b.sitename)   
  else   '  =>   '+rtrim(b.liname)+':   '+rtrim(b.sitename)   
  end,   
  liname=b.liname,sitename=b.sitename,number=b.number-1,   
  @l,   
  case   when   a.liname=b.liname   then   a.gid   else     
  a.gid+1   end   
  from   #m   a,sili   b   
  where   a.level=@l-1   
  and(
 a.liname=b.liname   and   a.number=b.number   
  or     
  a.sitename=b.sitename  and   a.liname<>b.liname)   
  continue   
  end   
  select   起点站=@begin 
  ,终点站=@end   
  ,转车次数=gid   
  ,经过站数=case   when   gid<3   then   @l   else   @l-gid+2     
  end   
  ,乘车线路=Line+')'     
  from   #m   where   level=@l   and   sitename=@end  
    
    
    
  --   从正反两面判断是否存在路线,如果不存在,则提示!   
  if   not   exists(select   起点站=@begin  
  ,终点站=@end   
  ,转车次数=gid   
  ,经过站数=case   when   gid<3   then   @l   else   @l-gid+2     
  end   
  ,乘车线路=Line+')'     
  from   #t   where   level=@l   and   sitename=@end)     
  and     
  not   exists(select   起点站=@begin   
  ,终点站=@end   
  ,转车次数=gid   
  ,经过站数=case   when   gid<3   then   @l   else   @l-gid+2     
  end   
  ,乘车线路=Line+')'     
  from   #m   where   level=@l   and   sitename=@end)     
  --   print   '没有符合条件的记录,请重新输入数据!!!'     
 begin   
  print   '没有找到符合条件的记录'   
  end   
    
    
  end 存储 select --------------------编程问答-------------------- 有点多,还是自己慢慢调试下吧
补充:.NET技术 ,  ASP.NET
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,