首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

怎么写这样的存储过程

2012-02-05 
如何写这样的存储过程?车次表busNum车次起点终点101ac102bd车站表station站号站名1a2b3c4dbus表自动编号车

如何写这样的存储过程?
车次表   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,我是看到了就保存下来。

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

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

热点排行