1

我正在基于数据库中的 SQL 存储过程创建报表(在 Crystal Reports XI 中)。该查询接受一些参数,并返回指定日期范围内的记录。如果传入参数,它们用于确定要返回哪些记录。如果没有传入一个或多个参数,则该字段不用于限制返回的记录类型。这有点复杂,所以这是我的 WHERE 子句:

WHERE  ((Date > @start_date) AND (Date < @end_date)) 
    AND (@EmployeeID IS NULL OR emp_id = @EmployeeID) 
    AND (@ClientID IS NULL OR client_id = @ClientID)
    AND (@ProjectID IS NULL OR project_id  = @ProjectID)
    AND (@Group IS NULL OR group = @Group)

现在,对于问题:

查询(和报告)非常适合 2000-2005 年范围内的旧数据。然而,最近几年,WHERE 子句并没有正确过滤数据:它只返回参数@Group 为 NULL 的记录(即:未传入)。

任何提示、提示或线索表示赞赏!

4

3 回答 3

3

解决了!

毕竟,它实际上与 WHERE 子句无关。我让 SQL Server 为我生成了一个内连接,它应该是一个左连接:近年来的许多记录不包含连接表中的条目(费用),所以它们没有显示出来。有趣的是,最近在费用表中有条目的少数记录的组值为 NULL,这就是为什么我只在 @Group 为 NULL 时才获得记录的原因。

故事的寓意: 1. 仔细检查自动生成的任何内容;和 2. 寻找 NULL 值!(n8wl - 感谢您提示我仔细查看 NULL。)

于 2010-12-12T00:34:32.290 回答
1

您的较新数据(2005 年后)在 emp_id、client_id、project _id 或 group 中包含 NULL 行的可能性有多大?如果它们是 NULL,它们将无法匹配您传递的参数。

于 2010-12-02T20:18:03.073 回答
0

由于 Date 和 group 是保留字,您可以尝试在字段周围放置方括号,以便不处理它们。这样做可以摆脱这样的“奇怪”问题。这样就可以了:

WHERE  (([Date] > @start_date) AND ([Date] < @end_date)) 
AND (@EmployeeID IS NULL OR emp_id = @EmployeeID) 
AND (@ClientID IS NULL OR client_id = @ClientID)
AND (@ProjectID IS NULL OR project_id  = @ProjectID)
AND (@Group IS NULL OR [group] = @Group)
于 2010-12-02T19:47:03.797 回答