redsun0220

导航

给存储过程传递数组变解............

由于SQL 2000中存储过程不支持数组,所以只能采取一些变通的方式来解决,我们可以利用SQL Server强大的字符串处理函数.首先要把传递到存储过程中的数组格式化为类似"1,2,3,4,5,6"或"1|2|3|4|5|6". 然后在存储过程中用SubString配合CharIndex把其分割开来,就好像给存储过程传递了数组一样.
具体如何做,从以下代码中可以明其原理:
 1  CREATE PROCEDURE  Gjb_SearchQuote 
 2         @TripType smallint,@DeCityCode nchar(30),@ArCityCode nchar(30),@AirCom nchar(5),@LookType nchar(7),
 3         @S_time datetime,@Cabin smallint,@UBigType smallint,@USmallType smallint,@IsRotate varchar(1)
 4  AS
 5 declare @sql varchar(1000),@PointerPrev smallint,@PointerCurr smallint
 6 /*上一次搜索的索引与当前搜索的索引,初始值都为1*/
 7 set @PointerPrev=1
 8 set @PointerCurr=1
 9 
10 /*获取大类ID以及小类ID*/
11 if @UBigType=-1 and @USmallType=-1
12   begin
13        set @UBigType=1
14        set @USmallType=1
15   end
16 
17 /*初始化SQL语句*/
18 set @sql='select Q.QuoteID,IFCommend,DepartureCity,ArrivalCity,AirLine,TraverPeriodFrom,TraverPeriodTo,FareEffectiveFrom,FareEffectiveTo,
19       Class,FareType,RotateAddr,StayDayMin,StayDayMax,Explain,ReservationTicketing,ReservationTicketing,Combination,CurrencyCode,
20       OfficeCode,Fare,WMmemo2  from GJB_Quote Q,GJB_Price P ,Gjb_Dim_CurrencyType C where QuoteStatusID=2 '
21 set @sql=@sql+' and P.UserTypeBigID='+cast(@UBigType as varchar)+' and P.UserTypeSmallID='+cast(@USmallType as varchar)+'  and Q.TripTypeID='+cast(@TripType as varchar)
22 set @sql=@sql+' and Q.ClassID='+cast(@Cabin as varchar)+'  and Q.TraverPeriodFrom<=cast('''+cast(@S_time as varchar)+''' as DateTime)  and Q.TraverPeriodTo>=cast('''+cast(@S_time as varchar)
23 
24 /*循环获取出发城市三字代码:CAN|PEK|SIN格式*/
25 set @sql=@sql+''' as DateTime)  and (Q.DepartureCity like ''%'+substring(@DeCityCode,@PointerPrev,3)+'%'''
26 set @PointerCurr = CharIndex('|',@DeCityCode,@PointerPrev)
27 set @PointerPrev = @PointerCurr+1
28 
29 while @PointerPrev+2<=Len(@DeCityCode)
30    begin    
31     set @sql=@sql+' or Q.DepartureCity like ''%'+substring(@DeCityCode,@PointerPrev,3)+'%'''
32     set @PointerCurr = CharIndex('|',@DeCityCode,@PointerPrev)
33     if @PointerCurr=0
34           break
35     set @PointerPrev = @PointerCurr+1
36    end
37 
38 /*恢复初始值*/
39 set @PointerPrev=1
40 set @PointerCurr=1
41 
42 /*循环获取到达城市三字代码:CAN|PEK|SIN格式*/
43 set @sql=@sql+') and (Q.ArrivalCity like ''%'+substring(@ArCityCode,@PointerPrev,3)+'%'''
44 set @PointerCurr = CharIndex('|',@ArCityCode,@PointerPrev)
45 set @PointerPrev = @PointerCurr+1
46 
47 while @PointerPrev+2<=Len(@ArCityCode)
48    begin    
49     set @sql=@sql+' or Q.ArrivalCity like ''%'+substring(@ArCityCode,@PointerPrev,3)+'%'''
50     set @PointerCurr = CharIndex('|',@ArCityCode,@PointerPrev)
51           if @PointerCurr=0
52           break
53     set @PointerPrev = @PointerCurr+1
54    end
55 set @sql=@sql+')'
56 /*  1表示转机、2表示直飞、3表示全部*/
57 if @IsRotate='1'
58     begin
59       set @sql = @sql+'  and  RotateAddr<>''''  and RotateAddr<>''-'''
60      end
61 else
62 if @IsRotate='2'
63    begin
64        set @sql = @sql+'  and ( RotateAddr=''''  or RotateAddr=''-'')'
65     end
66 
67 /*三表关联,防止笛卡尔积*/
68 set @sql=@sql+'  and Q.QuoteID=P.QuoteID and C.CurrencyTypeID=Q.CurrencyTypeID'
69 /*是否有航空公司限制*/
70 if @AirCom<>'all'
71   begin
72     set @sql = @sql+' and Q.AirLine='''+@AirCom+''''
73   end
74 /*排序方式*/
75 if @LookType='price'
76   begin
77     set @sql = @sql+' order by IFCommend desc,Fare'
78   end
79 else
80   begin
81     set @sql = @sql+' rder by IFCommend desc,AirLine'
82   end
83 /*执行SQL语句*/
84 exec(@sql)
85 GO
86 

posted on 2006-02-23 13:11  镜中的毒药  阅读(848)  评论(0)    收藏  举报