首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 哪位能注解邹老大写的存储过程
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-04-28 22:35:33 楼主

    :)
    下面是邹建老大写的,从 WHILE  @@ROWCOUNT>0 开始,注解一下这样定的原理与及一些语法上的应用。
    --测试数据 
      CREATE  TABLE  table_Bus( 
      BusID                      nvarchar(10), 
      BusStation            nvarchar(10), 
      BusStationIndex  int) 
      INSERT  table_Bus   
      SELECT  N'8路'    ,N'站A',1  UNION  ALL 
      SELECT  N'8路'    ,N'站B',2  UNION  ALL 
      SELECT  N'8路'    ,N'站C',3  UNION  ALL 
      SELECT  N'8路'    ,N'站D',4  UNION  ALL 
      SELECT  N'8路'    ,N'站J',5  UNION  ALL 
      SELECT  N'8路'    ,N'站L',6  UNION  ALL 
      SELECT  N'8路'    ,N'站M',7  UNION  ALL 
      SELECT  N'20路'  ,N'站G',1  UNION  ALL 
      SELECT  N'20路'  ,N'站H',2  UNION  ALL 
      SELECT  N'20路'  ,N'站I',3  UNION  ALL 
      SELECT  N'20路'  ,N'站J',4  UNION  ALL 
      SELECT  N'20路'  ,N'站L',5  UNION  ALL 
      SELECT  N'20路'  ,N'站M',6  UNION  ALL 
      SELECT  N'255路',N'站N',1  UNION  ALL 
      SELECT  N'255路',N'站O',2  UNION  ALL 
      SELECT  N'255路',N'站P',3  UNION  ALL 
      SELECT  N'255路',N'站Q',4  UNION  ALL 
      SELECT  N'255路',N'站J',5  UNION  ALL 
      SELECT  N'255路',N'站D',6  UNION  ALL 
      SELECT  N'255路',N'站E',7  UNION  ALL 
      SELECT  N'255路',N'站F',8 
      GO 
     
     
    SQL code
    --线路查询存储过程 CREATE PROC p_qry @Station_Start nvarchar(10), @Station_Stop nvarchar(10) AS SET NOCOUNT ON DECLARE @l int SET @l=0 SELECT BusID,BusStation, Line=CAST('('+RTRIM(BusID)+': '+RTRIM(BusStation) as nvarchar(4000)), BusStationIndex=BusStationIndex, Level=@l, gid=1 INTO # FROM table_Bus WHERE BusStation=@Station_Start WHILE @@ROWCOUNT>0 AND NOT EXISTS(SELECT * FROM # WHERE BusStation=@Station_Stop OR LEN(Line)=4000) BEGIN SET @l=@l+1 INSERT #(Line,BusID,BusStation,BusStationIndex,Level,gid) SELECT Line=a.Line+CASE WHEN a.BusID=b.BusID THEN N'->'+RTRIM(b.BusStation) ELSE N') => ('+RTRIM(b.BusID) +N': '+RTRIM(b.BusStation) END, b.BusID,b.BusStation,b.BusStationIndex,@l, CASE WHEN a.BusID=b.BusID THEN a.gid ---?when是什么语法哦帮助也没找到 ELSE a.gid+1 END FROM # a,table_Bus b WHERE a.Level=@l-1 AND( a.BusID=b.BusID AND( a.BusStationIndex=b.BusStationIndex+1 OR a.BusStationIndex=b.BusStationIndex-1) OR a.BusStation=b.BusStation AND a.BusID<>b.BusID) END SELECT N'起点站'=@Station_Start ,N'终点站'=@Station_Stop ,N'转车次数'=gid-1 ,N'经过站数'=CASE WHEN gid<3 THEN @l ELSE @l-gid+2 END ,N'乘车线路'=Line+N')' FROM # WHERE Level=@l AND BusStation=@Station_Stop IF @@ROWCOUNT =0 SELECT * FROM # GO

     
      --调用 
      EXEC  p_qry  N'站A',N'站L' 
      EXEC  p_qry  N'站A',N'站O' 
      EXEC  p_qry  N'站O',N'站M' 
      GO 
     
      --删除测试 
      DROP  TABLE  table_Bus 
      DROP  PROC  p_qry 
     
      /*--结果 
      起点站    终点站    转车次数      经过站数        乘车线路 
      ------  -------  ---------  -----------  ---------------------------------- 
      站A        站L          0                  5                      (8路:  站A->站B->站C->站D->站J->站L) 
     
      起点站    终点站  转车次数      经过站数        乘车线路 
      ------  ------  ---------  -----------  ------------------------------------------------------------ 
      站A        站O        1                  8                      (8路:  站A->站B->站C->站D->站J)  =>  (255路:  站J->站Q->站P->站O) 
      站A        站O        1                  8                      (8路:  站A->站B->站C->站D)  =>  (255路:  站D->站J->站Q->站P->站O) 
     
      起点站  终点站    转车次数    经过站数      乘车线路 
      -----  -------  --------  ----------  --------------------------------------------------- 
      站O      站M          1                6                    (255路:  站O->站P->站Q->站J)  =>  (8路:  站J->站L->站M) 
      站O      站M          1                6                    (255路:  站O->站P->站Q->站J)  =>  (20路:  站J->站L->站M) 
      --*/
    100  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • liangCK
    • 等级:
    发表于:2008-04-28 22:38:491楼 得分:0
    好复杂.帮顶.
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-04-28 22:40:162楼 得分:0
    这一段主要是case判断语句.
    语法结构:
    case when 条件 then 表达式 else 表达式 end
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-04-28 22:48:383楼 得分:0
    引用 2 楼 qianjin036a 的回复:
    这一段主要是case判断语句.
    语法结构:
    case when 条件 then 表达式 else 表达式 end

    我刚在SQL中看到了,的确有点复杂需要点时间
    还有这种数据表方式存储我还发现如果数据很大时查起来也很麻烦
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-04-28 23:02:264楼 得分:0
    SQL code
    --试着写一下,请各位不要拍砖: 1 建立一张临时表#(Line,BusID,BusStation,BusStationIndex,Level,gid); 2 先查询有无直达的车,若无影响行数,则说明有直达的车次; 3 若有影响行数(转车信息不能大于4000,数据类型限制),说明需要转车; 4 下面是一个临时表和原公交信息表的联接查询,完成经过几站,转几次车用拼接的转车信息; --最后的不能讲得细,等LX解惑; --以前做过列车查询,是用集合嵌套做的,也挺绕,不过逻辑还可以;
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-04-28 23:07:305楼 得分:0
    引用 1 楼 liangCK 的回复:
    好复杂.帮顶.


    是很复杂的


    case when 相当于是 if else 了,学过VB的话应该好理解一些
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-04-28 23:07:396楼 得分:0
    SQL code
    CREATE PROC p_qry @Station_Start nvarchar(10), @Station_Stop nvarchar(10) AS SET NOCOUNT ON DECLARE @l int SET @l=0 SELECT BusID,BusStation, Line=CAST('('+RTRIM(BusID)+':'+RTRIM(BusStation) as nvarchar(4000)), BusStationIndex=BusStationIndex, Level=@l, gid=1 INTO # FROM table_Bus WHERE BusStation=@Station_Start WHILE @@ROWCOUNT>0 AND NOT EXISTS(SELECT * FROM # WHERE BusStation=@Station_Stop OR LEN(Line)=4000) BEGIN SET @l=@l+1 INSERT #(Line,BusID,BusStation,BusStationIndex,Level,gid) SELECT Line=a.Line+ CASE WHEN a.BusID=b.BusID THEN N'->'+RTRIM(b.BusStation) ELSE N') => ('+RTRIM(b.BusID) +N':'+RTRIM(b.BusStation) END, b.BusID,b.BusStation,b.BusStationIndex,@l, CASE WHEN a.BusID=b.BusID THEN a.gid ---?when是什么语法哦帮助也没找到 ELSE a.gid+1 END FROM # a,table_Bus b WHERE a.Level=@l-1 AND(a.BusID=b.BusID AND(a.BusStationIndex=b.BusStationIndex+1 OR a.BusStationIndex=b.BusStationIndex-1) OR a.BusStation=b.BusStation AND a.BusID<>b.BusID) END SELECT N'起点站'=@Station_Start ,N'终点站'=@Station_Stop ,N'转车次数'=gid-1 ,N'经过站数'=CASE WHEN gid<3 THEN @l ELSE @l-gid+2 END ,N'乘车线路'=Line+N')' FROM # WHERE Level=@l AND BusStation=@Station_Stop IF @@ROWCOUNT =0 begin SELECT * FROM # end GO

    我帮上面那位老兄整理一下
    (挨两砖也是在所难免的)
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-04-28 23:09:267楼 得分:0
    用这种存储过程会很慢的,如果数据过多的话
    我不推荐过多的使用
    SQL code
    Case When Then else End
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-04-29 09:44:268楼 得分:0
    帮顶
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-04-29 09:44:489楼 得分:0
    学习一下
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-04-29 09:46:3510楼 得分:0
    look look
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-04-29 10:11:1511楼 得分:0
    SQL code
    CREATE PROC p_qry @Station_Start nvarchar(10), @Station_Stop nvarchar(10) AS SET NOCOUNT ON DECLARE @l int SET @l=0 --把通过起始站的线路信息插入到临时表 Level 站序号 gid 换乘次数 SELECT BusID,BusStation, Line=CAST('('+RTRIM(BusID)+': '+RTRIM(BusStation) as nvarchar(4000)), BusStationIndex=BusStationIndex, Level=@l, gid=1 INTO # FROM table_Bus WHERE BusStation=@Station_Start WHILE @@ROWCOUNT>0 AND NOT EXISTS(SELECT * FROM # WHERE BusStation=@Station_Stop OR LEN(Line)=4000) --如果没有找到结束站点循环 BEGIN SET @l=@l+1 INSERT #(Line,BusID,BusStation,BusStationIndex,Level,gid) SELECT Line=a.Line+CASE WHEN a.BusID=b.BusID THEN N'->'+RTRIM(b.BusStation) ELSE N') => ('+RTRIM(b.BusID) +N': '+RTRIM(b.BusStation) END, b.BusID,b.BusStation,b.BusStationIndex,@l, --LINE 每次都根据最后一个添加更新 CASE WHEN a.BusID=b.BusID THEN a.gid ---?when是什么语法哦帮助也没找到 ELSE a.gid+1 END FROM # a,table_Bus b WHERE a.Level=@l-1 AND( --查询当前站的同一班次车的上一站或者下一战 a.BusID=b.BusID AND( a.BusStationIndex=b.BusStationIndex+1 OR a.BusStationIndex=b.BusStationIndex-1) OR --查询当前站的不同班次车的上一站或者下一战 a.BusStation=b.BusStation AND a.BusID<>b.BusID) --插入的哦临时表里 END SELECT N'起点站'=@Station_Start ,N'终点站'=@Station_Stop ,N'转车次数'=gid-1 ,N'经过站数'=CASE WHEN gid<3 THEN @l ELSE @l-gid+2 END ,N'乘车线路'=Line+N')' FROM # WHERE Level=@l AND BusStation=@Station_Stop --查询出临时表里最后信息 IF @@ROWCOUNT =0 SELECT * FROM # GO
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-02 13:05:0912楼 得分:0
    我觉得用temp表这样数据好慢啊,有没有哪位知道如何优化一下,我加点分大家共同研究一下
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-17 17:34:1813楼 得分:0

    有心脑血管疾病的朋友看贴时千万要慎重
    哈哈
    修改 删除 举报 引用 回复

    网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
    世纪乐知(北京)网络技术有限公司 版权所有 京 ICP 证 020026 号
    Copyright © 2000-2007, CSDN.NET, All Rights Reserved