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

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年以内的旧数据方面非常出色。但是,近年来,其中的子句未正确过滤数据:它仅返回参数@group为null的记录(即:未传递)。

任何提示,技巧或潜在客户都将受到赞赏!

有帮助吗?

解决方案

解决了!

毕竟,它实际上与Where子句无关。我让SQL Server为我生成了一个内在的加入,这本来应该是一个左键:近年来的许多记录不包含加入表(费用)中的条目,因此它们没有出现。有趣的是,在费用表中确实有一些条目的近期记录具有零值的零值,这就是为什么我只有在@group为null时才能获得记录的原因。

故事的道德:1。仔细检查任何自动生成的东西; 2.寻找无效的值! (N8WL-感谢您给我仔细观察空的提示。)

其他提示

您的较新数据(2005年后)在EMP_ID,client_id,project _id或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)
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top