基于多参数的SQL存储过程搜索查询

时间:2012-01-29 17:03:54

标签: sql sql-server-2008 stored-procedures multiple-select-query

好的,我需要一点存储过程的帮助,这有点过头了,我不知道该怎么办。 SP用于我正在进行的项目中的搜索功能。它是根据最终用户的选择找到可用的座位。用户应该能够根据以下内容进行搜索:

离境机场(或“任何”)

抵达机场(或“任何”)

最早的出发时间

最新离开时间

可用的最小席位

要返回的最大航班

我最初认为单独的SELECT语句可以解决这个问题,但正如您可能知道的那样,select语句被视为单独的查询,并且返回产生了6种不同的返回。所以,我试图将它们包含在一个SELECT中,但我的逻辑必须是棘手的,因为返回有问题。如果有人能指出我正确的方向,我将非常感激。代码如下:

ALTER PROCEDURE [dbo].[usp_FindSeats]
(
@DepartureAirport           char(3),
@ArrivalAirport             char(3),
@EarliestDepTime            datetime,
@LatestDepTime              datetime,
@minSeatsAvailable          int,
@maxFlightsRequested        int

 )

AS
BEGIN

SELECT * FROM Flight
WHERE
(@DepartureAirport = UPPER('ANY') OR DepartAirport = @DepartureAirport)
AND
(@ArrivalAirport = UPPER('ANY') OR ArriveAirport = @ArrivalAirport) 
AND
(DepartTime >= @EarliestDepTime) 
AND
(DepartTime <= @LatestDepTime) 
AND
(FlightSeatsAvailiable >= @minSeatsAvailable) 
AND
((SELECT COUNT(FlightID) FROM Flight) <= @maxFlightsRequested)


--IF (@DepartureAirport = UPPER('ANY')) 
--BEGIN
--(SELECT * FROM Flight WHERE DepartAirport != '')
--END
--ELSE
--SELECT * FROM Flight WHERE DepartAirport = @DepartureAirport


--IF (@ArrivalAirport = UPPER('ANY'))
--Begin
--(SELECT * FROM Flight WHERE ArriveAirport != '')
--END
--ELSE
--SELECT * FROM Flight WHERE ArriveAirport = @ArrivalAirport


--SELECT * FROM Flight WHERE DepartTime >= @EarliestDepTime

--SELECT * FROM Flight WHERE DepartTime <= @LatestDepTime

--SELECT * FROM Flight WHERE FlightSeatsAvailiable >= @minSeatsAvailable

--SELECT * FROM Flight WHERE (SELECT COUNT(FlightID) FROM Flight) <= @maxFlightsRequested

2 个答案:

答案 0 :(得分:0)

如果我理解你的需要,最简单的方法是:

SELECT * FROM Flight 哪里 (@DepartureAirport = UPPER('ANY')或DepartAirport = @DepartureAirport) 联盟 SELECT * FROM Flight 哪里 (@ArrivalAirport = UPPER('ANY')或ArriveAirport = @ArrivalAirport) AUNION SELECT * FROM Flight 哪里 (DepartTime&gt; = @EarliestDepTime) 联盟 SELECT * FROM Flight 哪里 (DepartTime&lt; = @LatestDepTime) 联盟 SELECT * FROM Flight 哪里 (FlightSeatsAvailiable&gt; = @minSeatsAvailable) 联盟 SELECT * FROM Flight 哪里 ((SELECT COUNT(FlightID)FROM Flight)&lt; = @maxFlightsRequested)

这将根据用户的输入汇总所有结果。

答案 1 :(得分:0)

试试这个:

ALTER PROCEDURE [dbo].[usp_FindSeats]
(
    @DepartureAirport           char(3),
    @ArrivalAirport             char(3),
    @EarliestDepTime            datetime,
    @LatestDepTime              datetime,
    @minSeatsAvailable          int,
    @maxFlightsRequested        int    
 )    
AS

SELECT  TOP(@maxFlightsRequested) * 
FROM    Flight
WHERE   (@DepartureAirport = 'any' OR DepartAirport = @DepartureAirport)
        AND (@ArrivalAirport = 'any' OR ArriveAirport = @ArrivalAirport) 
        AND DepartTime >= @EarliestDepTime
        AND DepartTime <= @LatestDepTime
        AND FlightSeatsAvailiable >= @minSeatsAvailable

请注意,如果您限制返回的行数,那么以某种方式对结果进行排序可能是个好主意(ORDER BY)。