-- 最短乘车路线查询示例(邹老大的。) 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 -- 乘车线路查询存储过程 CREATE PROC p_qry @Station_Start nvarchar ( 10 ), @Station_Stop nvarchar ( 10 ) AS SET NOCOUNT ON DECLARE @l int SET @l = 0 SELECT ID,Station, Line = CAST ( ' ( ' + RTRIM (ID) + ' : ' + RTRIM (Station) as nvarchar ( 4000 )), Orders = Orders, [ Level ] = @l INTO # FROM T_Line WHERE Station = @Station_Start WHILE @@ROWCOUNT > 0 AND NOT EXISTS ( SELECT * FROM # WHERE Station = @Station_Stop ) BEGIN SET @l = @l + 1 INSERT #(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 # 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 # WHERE [ Level ] = @l AND Station = @Station_Stop IF @@ROWCOUNT = 0 -- 如果未有可以到达的线路,则显示处理结果表备查 SELECT * FROM # GO -- 调用 EXEC p_qry N ' 站A ' ,N ' 站L ' /**/ /*--结果 起点站 终点站 乘车线路 ---------- ------------ ----------------------------------------------------------- 站A 站L (8路: 站A->站B->站C->站D->站J->站L) --*/