我的SQL if语句没有读取我传递它的值

时间:2014-03-21 09:20:02

标签: sql sql-server select stored-procedures where

您好我是SQL的新手,所以这可能是一个基本问题。我试图传递一个变量并使用该变量内容来确定它运行的内容。变量是char(2),它可以具有以下可能的值:

接受  = AP

所有  = AL

拒绝  = DE

直线经理接受  = LA

管理员已接受  = AA

这是应该做的。我应该输入一个开始和结束日期,然后输入两位数代码来决定我选择的假期预订。在下面的示例中,我正在寻找2个假期之间的任何状态(接受或拒绝)的日期范围:

    EXEC spSearchHoliday '2013-04-01','2015-05-24','PE'

这会返回正确的结果!但是,如果我尝试在两个日期之间运行任何其他状态的日期搜索,它将继续返回每个日期。在下面的示例中,我只想返回已接受的假期:

    EXEC spSearchHoliday '2013-04-01','2015-05-24','AP'

但相反,它仍会返回范围之间的每个状态假期。

以下是存储过程本身,长holidays.startdateholidays.EndDate部分可以很好地处理无法正常工作的状态相关部分。

    AS
BEGIN
    IF @Status = 'AL'
        BEGIN
            SELECT  StartDate,
                    EndDate,
                    Duration,
                    [Status]
            FROM    Holidays
            WHERE   Holidays.Startdate <= @Startdate AND Holidays.Enddate >= @EndDate
                    OR Holidays.Startdate >= @Startdate AND Holidays.Enddate <= @EndDate
                    OR Holidays.Startdate <= @Enddate AND Holidays.Enddate >= @EndDate
                    OR Holidays.Startdate <= @Startdate AND Holidays.Enddate >= @Startdate
        END
    IF @Status <> 'AL'
        BEGIN
            SELECT  StartDate,
                    EndDate,
                    Duration,
                    [Status]
            FROM    Holidays
            WHERE   Holidays.Status = @Status
                    AND Holidays.Startdate <= @Startdate AND Holidays.Enddate >= @EndDate
                    OR Holidays.Startdate >= @Startdate AND Holidays.Enddate <= @EndDate 
                    OR Holidays.Startdate <= @Enddate AND Holidays.Enddate >= @EndDate
                    OR Holidays.Startdate <= @Startdate AND Holidays.Enddate >= @Startdate
        END
END

1 个答案:

答案 0 :(得分:2)

第二个查询中的问题可能是错误的优先级。请在第二个查询中尝试使用以下WHERE子句:

WHERE   Holidays.Status = @Status
        AND (Holidays.Startdate <= @Startdate AND Holidays.Enddate >= @EndDate
        OR Holidays.Startdate >= @Startdate AND Holidays.Enddate <= @EndDate 
        OR Holidays.Startdate <= @Enddate AND Holidays.Enddate >= @EndDate
        OR Holidays.Startdate <= @Startdate AND Holidays.Enddate >= @Startdate)