0

わかりました。ストアド プロシージャについて少し助けが必要です。それは私の頭を少し超えていて、どのように進めればよいかわかりません。SPは、私が取り組んでいるプロジェクトの検索機能用です。エンドユーザーからの選択に基づいて、利用可能な座席を見つけることです。ユーザーは、以下に基づいて検索できる必要があります。

出発空港(または「ANY」)

到着空港(または「ANY」)

最早出発時間

最終出発時刻

最小座席数

返還される最大フライト数

最初は、個別の SELECT ステートメントでうまくいくと思っていましたが、ご存じのとおり、select ステートメントは個別のクエリとして扱われ、6 つの異なる結果が返されました。だから、私はそれらを 1 つの 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
4

2 に答える 2

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) で結果をソートすることをお勧めします。

于 2012-01-29T18:20:41.277 に答える
0

あなたの必要性を正しく理解していれば、最も簡単なアプローチは次のとおりです。

SELECT * FROM フライト WHERE (@DepartureAirport = UPPER('ANY') OR DepartAirport = @DepartureAirport) UNION SELECT * FROM フライト WHERE (@ArrivalAirport = UPPER('ANY') OR ArriveAirport = @ArrivalAirport) AUNION SELECT * FROM フライト WHERE ( DepartTime >= @EarliestDepTime) UNION SELECT * FROM Flight WHERE (DepartTime <= @LatestDepTime) UNION SELECT * FROM Flight WHERE (FlightSeatsAvailiable >= @minSeatsAvailable) UNION SELECT * FROM Flight WHERE ((SELECT COUNT(FlightID) FROM Flight) <= @maxFlightsRequested)

これにより、ユーザーの入力に応じてすべての結果が集約されます。

于 2012-01-29T18:05:26.777 に答える