CREATEfunction SplitString( @Stringvarchar(2048), @SplitCharchar ) returns@restable( Value varchar(128), vindex int ) as begin declare@indexint,@unitvarchar(128),@inextint,@lenint,@iint set@index=1 set@i=1 set@len=len(@String) while@index<=@len begin set@inext=charindex(@SplitChar,@String,@index) if@inext=0set@inext=@len+1 if@inext>@index begin set@unit=ltrim(rtrim(substring(@String,@index,@inext-@index))) if@unit<>'' begin insertinto@res (value,vindex) values (@unit,@i) set@i=@i+1 end end set@index=@inext+1 end return end
CREATEproc InsertRoute(@Routevarchar(32),@Stops_Strvarchar(1024)) as begin declare@stopstable(name varchar(32),position int) insert@stops(name,position) select Value,vIndex from dbo.SplitString(@Stops_Str,'-')
begintran t1 savetran sp1
--插入路线信息 insertinto Route (name) values (@Route) if(@@error<>0) begin rollbacktran sp1 committran t1 raiserror('插入路线时发生错误',16,1) return end
--插入不存在的站点 insert Stop(name) selectdistinct name from@stops ss where name notin (select name from Stop) if(@@error<>0) begin rollbacktran sp1 committran t1 raiserror('插入路线时发生错误',16,1) return end
insert stop_route(Stop,Route,Position) select ss.name,@Route,ss.position from@stops ss if(@@error<>0) begin rollbacktran sp1 committran t1 raiserror('插入路线时发生错误',16,1) return end
committran t1 end
插入新地名函数:
InsertSpot /* 插入新地名 @name:地名 @Stops:地名附近的所有站点,多个站点用'/'隔开 @Remark:与地名相关的说明 */ CREATEproc InsertSpot( @namevarchar(64), @Stops_Strvarchar(1024), @Remarkvarchar(1024) ) as begin declare@stopstable(name varchar(32)) insert@stopsselectdistinct Value from dbo.SplitString(@Stops_Str,'/')
declare@nvarchar(32) set@n='' selecttop1@n=name from@stops s where name notin (select name from stop) if(@n<>'') begin raiserror ('站点%s不存在',16,1,@n) return end
CREATEproc InquiryT0(@StartStopsvarchar(32),@EndStopsvarchar(32)) as begin declare@ss_tabtable(name varchar(32)) declare@es_tabtable(name varchar(32)) insert@ss_tabselect Value from dbo.SplitString(@StartStops,'/') insert@es_tabselect Value from dbo.SplitString(@EndStops,'/') if(exists(select*from@ss_tab sst,@es_tab est where sst.name=est.name)) begin raiserror ('起点集和终点集中含有相同的站点',16,1) return end select sst.name as 启始站点, est.name as 目的站点, r.Route as 乘坐线路, r.StopCount as 经过的站点数 from @ss_tab sst, @es_tab est, RouteT0 r where sst.name=r.StartStop and r.EndStop=est.name end
CREATEproc InquiryT1(@StartStopsvarchar(32),@EndStopsvarchar(32)) as begin declare@ss_tabtable(name varchar(32)) declare@es_tabtable(name varchar(32)) insert@ss_tabselect Value from dbo.SplitString(@StartStops,'/') insert@es_tabselect Value from dbo.SplitString(@EndStops,'/') if(exists(select*from@ss_tab sst,@es_tab est where sst.name=est.name)) begin raiserror ('起点集和终点集中含有相同的站点',16,1) return end
declare@stopstable(name varchar(32)) insert@stopsselect name from@ss_tab insert@stopsselect name from@es_tab
select sst.name as 起始站点, r1.Route as 乘坐路线1, r1.EndStop as 中转站点1, r2.Route as 乘坐路线2, est.name as 目的站点, r1.StopCount+r2.StopCount as 总站点数 from @ss_tab sst, @es_tab est, (select*from RouteT0 where EndStop notin (select name from@stops)) r1, RouteT0 r2 where sst.name=r1.StartStop and r1.EndStop=r2.StartStop and r2.EndStop=est.name and r1.Route<>r2.Route end
CREATEproc InquiryT2(@StartStopsvarchar(32),@EndStopsvarchar(32)) as begin declare@ss_tabtable(name varchar(32)) declare@es_tabtable(name varchar(32)) insert@ss_tabselect Value from dbo.SplitString(@StartStops,'/') insert@es_tabselect Value from dbo.SplitString(@EndStops,'/') if(exists(select*from@ss_tab sst,@es_tab est where sst.name=est.name)) begin raiserror ('起点集和终点集中含有相同的站点',16,1) return end
declare@stopstable(name varchar(32)) insert@stopsselect name from@ss_tab insert@stopsselect name from@es_tab
select r1.StartStop as 启始站点, r1.Route as 乘坐路线1, r1.EndStop as 中转站点1, r2.Route as 乘坐路线2, r2.EndStop as 中转站点2, r3.Route as 乘坐路线3, r3.EndStop as 目的站点, r1.StopCount+r2.StopCount+r3.StopCount as 总站点数 from @ss_tab sst, @es_tab est, (select*from RouteT0 where EndStop notin (select name from@stops)) r1, (select*from RouteT0 where EndStop notin (select name from@stops)) r2, RouteT0 r3 where sst.name=r1.StartStop and r1.EndStop=r2.StartStop and r2.EndStop=r3.StartStop and r3.EndStop=est.name and r1.Route<>r2.Route and r2.Route<>r3.Route and r3.Route<>r1.Route end
CREATEproc Inquiry(@StartStopsvarchar(32),@EndStopsvarchar(32)) as begin exec InquiryT0 @StartStops,@EndStops if(@@rowcount=0) begin exec InquiryT1 @StartStops,@EndStops if(@@rowcount=0) begin exec InquiryT2 @StartStops,@EndStops end end end
CREATEfunction GetStopsOfSpot(@Spotvarchar(32)) returnsvarchar(1024) as begin declare@stopsvarchar(1024) set@stops='' select@stops=@stops+'/'+stop from stop_spot where Spot=@Spot returnsubstring(@stops,2,len(@stops)-1) end