if OBJECT_ID('T_Line','u')is not null
drop table T_Line
go
CREATE TABLE T_Line(
ID      nvarchar(10),  --公交线路号
Station nvarchar(10),  --站点名称
Orders  int)           --行车方向(通过它反应每个站的上一个、下一个站)
INSERT T_Line
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
 
if object_id('usp_bus_way_line','p')is not null
drop proc usp_bus_way_line
go
--======================================================
--Author:    Jimmy
--Create Date: 2013-10-11
--Description: 乘车线路查询存储过程
--======================================================
create proc usp_bus_way_line
@Station_Start nvarchar(10),   --起始站
@Station_Stop  nvarchar(10)    --终点站
as
begin
-- 关闭返回行计数
set nocount on
declare @l int
set @l=0
-- 输入起始站为条件,把查询出来的数据插入到临时表中
select ID,Station,
--Line主要取值是(id:站名
   Line=CAST('('+RTRIM(ID)+': '+RTRIM(Station) as nvarchar(4000)),
   Orders=Orders,
   [Level]=@l
into #table from T_Line
where Station=@Station_Start
-- 循环直到@@ROWCOUNT>0并且终点站在临时表中不存在
while @@ROWCOUNT>0 and not exists(select * from #table where Station=@Station_Stop)
begin
set @l=@l+1
--向临时表中插入数据
insert #table(Line,ID,Station,Orders,[Level])
select
Line=a.Line+case when a.ID=b.ID then N'→'+RTRIM(b.Station)
 else N') 换乘 ('+RTRIM(b.ID) +N': '+RTRIM(b.Station) end,
b.ID,b.Station,b.Orders,@l
from #table a,T_Line b
where a.[Level]=@l-1
  AND(
  a.Station=b.Station 
  AND a.ID<>b.ID
  OR a.ID=b.ID 
  AND( a.Orders=b.Orders+1 OR a.Orders=b.Orders-1)
  )
  AND LEN(a.Line)<4000
  AND PATINDEX('%[ >]'+b.Station+'[-)]%',a.Line)=0
end
--显示乘车路线
select N'起点站'=@Station_Start,
N'终点站'=@Station_Stop,
N'乘车线路'=Line+N')'
from #table
where [Level]=@l AND Station=@Station_Stop
--如果未有可以到达的线路,则显示处理结果表备查
if @@ROWCOUNT =0
select * from #table
end
go
 
--调用
exec usp_bus_way_line N'站A',N'站F'
go