给存储过程传递数组变解............
由于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
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
浙公网安备 33010602011771号