读书人

怎么写这样的存储过程

发布时间: 2012-02-05 12:07:14 作者: rapoo

如何写这样的存储过程?
车次表 busNum
车次 起点 终点
101 a c
102 b d

车站表station
站号 站名
1 a
2 b
3 c
4 d

bus表
自动编号 车次 站名
1 101 1
2 101 2
3 101 3
4 102 2
5 102 3
我想通过两个参数 (作为起始点 和终止点)
选择出 经过该站点的车次(及该车次经过的所有的站点)
这样的 写存储过程该怎么写? 还有就是如果没有通过两个站的公交车次 就转乘 ..
有思路的给个思路也行 谢谢

[解决办法]
----老大的例子--

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)
--*/

[解决办法]
已经很详细了啊!
[解决办法]
Limpire(昨夜小楼)真高啊
很像以前一例子
一下
[解决办法]
高手,我好好学习.
[解决办法]
主要是自遇到,也有去真研究,
[解决办法]
Limpire(昨夜小楼) ( )

请把老大书的Link地址给我们一下,谢谢!
[解决办法]
我没有Link,我是看到了就保存下来。

没有老大首肯,我也不能把保存下来的再发布一遍,对吧?

或者上老大的博客看看。
[解决办法]
问题比较复杂,除了线路的方向,最好有站与站的距离,有转车时,用于比较距离,避免转大弯.

读书人网 >SQL Server

热点推荐