Reporting Services /支持强大的过滤功能

时间:2009-06-01 15:39:01

标签: sql stored-procedures reporting-services

我正在寻找一种解决这种常见情况的“最佳实践”方式。我认为这个问题最好用一个例子来问。我们假设如下:

  • 目标是编写一份“订单摘要”报告,根据各种过滤条件显示订单列表。
    • 示例:用户想要报告在X和Y日期之间创建的所有订单
    • 示例:用户想要报告状态为“打开”的所有订单
    • 示例:用户想要报告由其他用户XYZ生成的所有订单
    • 示例:用户想要报告1000美元到10000美元之间的所有订单
  • 这些报告可能会从不同的页面启动,但也许可能会有一个“高级搜索”页面,允许他们检查/取消选中过滤器并定义参数

  • 我想使用远程处理来生成报告

通过报表参数和报表过滤器创建包含所有这些过滤器的单个报表变得非常麻烦且非常难以维护。这让我相信我应该创建一个接受所有可能过滤器值的存储过程(如果不应该通过参数过滤结果集,则为NULL)。

你同意这个评估吗?

如果是这样,我不是TSQL专家,并希望就如何实现此存储过程提供一些一般性建议。到目前为止,我这样做:

  1. 创建orderID @resultset
  2. 的表变量
  3. 最初通过第一个过滤器填充@resultset(我选择了开始和结束日期)
  4. 对于每个过滤器:
    • 如果定义了过滤器,则创建一个表变量@tempresultset并插入@resultset WHERE中的所有记录(过滤器适用)
    • 从@resultset删除,插入@resultset从@tempresultset中选择orderid
  5. 在应用所有过滤器后返回@resultset
  6. 这感觉不对劲/有效......有没有更好的方法来解决这个问题?

    非常感谢有关如何处理此一般问题的任何其他建议或建议。我觉得有点失去了实施这个解决方案的正确方法,看起来应该是一个非常普遍的问题。

1 个答案:

答案 0 :(得分:0)

经过一番研究后,我发现了一种在存储过程中的单个select语句中实现这些可选过滤器的好方法:

它看起来像:

SELECT ordernumber FROM orders
--Filter #1 - based on Parameter #1
WHERE (@param1 IS NULL) OR (somefield = @param1)
--Filter #2 - based on Parameter #2
AND WHERE (@param2 IS NULL) or (somefield2 = @param2)
--Filter #3 - based on Parameter #3
AND WHERE (@param3 IS NULL) or (somefield3 = @param3)