存储过程返回错误值?

Posted

技术标签:

【中文标题】存储过程返回错误值?【英文标题】:Stored procedure returning the wrong value? 【发布时间】:2014-05-15 09:17:04 【问题描述】:

我有一个存储过程来检查我的数据库中已预订的假期,它不应该考虑状态为“已拒绝”或“已取消”的假期,但我的数据库中只有一条记录具有拒绝状态,但此选择语句返回 1?

        SELECT COUNT(*) JobRoleID
        FROM        Employees
        RIGHT JOIN  Holidays
        ON          Employees.ID = Holidays.EmployeeID
        WHERE       Holidays.Status <> 'Declined' AND Holidays.Status <> 'Cancelled'
        AND        (Holidays.Startdate <= '2014/04/28' AND Holidays.Enddate >= '2014/04/30')
        OR         (Holidays.Startdate >= '2014/04/28' AND Holidays.Enddate <= '2014/04/30') 
        OR         (Holidays.Startdate <= '2014/04/30' AND Holidays.Enddate >= '2014/04/30') 
        OR         (Holidays.Startdate <= '2014/04/28' AND Holidays.Enddate >= '2014/04/28') 
        OR         (Holidays.StartDate = '2014/04/28' AND Holidays.EndDate = '2014/04/30')

【问题讨论】:

此行返回的假期状态如何? 【参考方案1】:

此处需要考虑运算符优先级。

Not -->  AND --> OR 

Not 优先于 AND,AND 优先于 OR。对于这些嵌套的 AND 和 OR,最好将它们放在括号中。

WHERE       Holidays.[Status] <> 'Declined' AND Holidays.[Status] <> 'Cancelled'
AND    
    (       (Holidays.Startdate <= '2014/04/28' AND Holidays.Enddate >= '2014/04/30')
        OR  (Holidays.Startdate >= '2014/04/28' AND Holidays.Enddate <= '2014/04/30') 
        OR  (Holidays.Startdate <= '2014/04/30' AND Holidays.Enddate >= '2014/04/30') 
        OR  (Holidays.Startdate <= '2014/04/28' AND Holidays.Enddate >= '2014/04/28') 
        OR  (Holidays.StartDate = '2014/04/28' AND Holidays.EndDate = '2014/04/30')
    )

如果在 sql 中使用方括号 [] 时,也要避免使用 Sql server 关键字作为列名。

【讨论】:

没问题,很高兴它有帮助:)【参考方案2】:
WHERE A AND B AND C OR D AND E OR F AND G

被视为相同

WHERE (A AND B AND C) OR (D AND E) OR (F AND G)

因此,如果除第一个日期比较之外的任何日期比较实际上是真的,那么整个 WHERE 子句就满足了。

顺便说一下,您似乎正在尝试找出两个日期范围是否重叠,并且是在非常复杂的情况下进行的。您应该只需要进行两次比较。两个日期范围重叠,如果:

第一个范围在第二个范围结束之前开始,并且 第二个范围在第一个范围结束之前开始

所以,类似:

SELECT COUNT(*) JobRoleID
    FROM        Employees
    RIGHT JOIN  Holidays
    ON          Employees.ID = Holidays.EmployeeID
    WHERE       Holidays.Status <> 'Declined' AND Holidays.Status <> 'Cancelled'
    AND    Holidays.StartDate <= '20140430' AND '20140428' <= Holidays.EndDate

应该相当于你的多重比较。

【讨论】:

感谢您的帮助:)

以上是关于存储过程返回错误值?的主要内容,如果未能解决你的问题,请参考以下文章

大型nvarchar2值返回时的oracle存储过程错误

从存储过程pymssql获取返回值

得到存储过程pymssql返回值

java如何获得mysql存储过程的返回值

sqlalchemy 调用 mssql存储过程如何获取返回值?

Oracle存储过程OUT CLOB返回错误字符串缓冲区太小