SSRS - 向参数查询添加静态null

时间:2012-04-30 21:56:58

标签: sql sql-server sql-server-2008 reporting-services ssrs-2008

我正在寻找一种向参数添加值的方法,该参数的可用值是从简单查询中检索的。我今天刚刚开始搞乱SSRS,我希望我没有做错。

从报告项目执行以下程序(我知道这很麻烦):

CREATE PROCEDURE RAW_TIME_VAR
        @EMPLID as varchar(6) = NULL
,       @EMPLNAME as varchar(80) = NULL
,       @CHARGENO as int = NULL
,       @TYPE as varchar(8) = NULL
,       @STARTDATE as date = NULL
,       @ENDDATE as date = NULL
AS
Select * from DBO.RAW_TIME
Where   ([EMPL ID] = @EMPLID OR @EMPLID IS NULL)
AND     ([EMPL NAME] = @EMPLNAME OR @EMPLNAME IS NULL)
AND     ([CHARGE NO] = @CHARGENO OR @CHARGENO IS NULL)
AND     ([CHARGE TYPE] = @TYPE OR @TYPE IS NULL)
AND     [CHARGE DATE] Between @STARTDATE AND @ENDDATE

报告项目中有两个数据集(我正在使用VS2008商业智能开发工作室)。一个是从上面的过程生成的(RAW_TIME_DATASET),另一个是来自同一视图的查询来填充员工ID和名称(NAMES):

SELECT DISTINCT [EMPL ID], [EMPL NAME]
FROM RAW_TIME
ORDER BY [EMPL ID]

我希望能够使用NAMES数据集中的所有员工姓名填充@EMPLNAME参数,同时还可以通过在参数组合框中选择值“全部”来传递NULL。查询可以使用UNION传递“全部”,将其置于组合框中而不在视图中,但我无法将其作为NULL传递给报告。呃...我希望这是有道理的。

2 个答案:

答案 0 :(得分:5)

你走在正确的轨道上。

如果您查看report_data标签,则会看到参数文件夹。展开它,您应该看到初始查询中的所有参数。右键单击EMPLNAME参数,选择参数属性,转到可用值并执行以下配置:

enter image description here

同样,在常规选项卡上,将参数标记为接受空值

现在,诀窍在于NAMES数据集。您必须选择所有名称,以及具有空值的行。有几种方法可以实现它,最简单的方法是在查询中添加以下内容:

union SELECT null as [EMPL ID], 'NULL' as [EMPL NAME]

如果不这样做,报告会抱怨参数不能为空。

结果(为简单起见,我只添加了2个参数):

enter image description here

答案 1 :(得分:1)

编辑:请注意,此答案仅在select位于数据集中时有效,但如果select位于存储过程中则不会。请参阅答案下面的评论。

如果您修改@EMPLNAME参数,则可以将其设置为“允许多个值”(msdn sample)。如果这样做,您必须更新其他查询中的where-clause-bit,如下所示:

AND     ([EMPL NAME] IN (@EMPLNAME) OR @EMPLNAME IS NULL)

我相信SSRS会在执行查询之前用逗号分隔的列表替换(@EMPLNAME)位(在常规(非动态)SQL afai中不能使用这种“IN @param”语法。因为员工name是一个字符串,它注意到链接的MSDN文章中的警告,并且只将它与可用值列表结合起来以防止出现安全问题。

修改:以上是(希望)您严格要求的内容,但将@EMPLID参数与@EMPLNAME结合起来更不合理参数?您可以将ID参数设置为多值,并将ID用作值,将NAME用作标签。有了这个,你最终会得到以下主数据集查询:

Where   ([EMPL ID] IN (@EMPLID) OR @EMPLID IS NULL)
-- AND     ([EMPL NAME] = @EMPLNAME OR @EMPLNAME IS NULL) -- not needed anymore