我正在寻找一种向参数添加值的方法,该参数的可用值是从简单查询中检索的。我今天刚刚开始搞乱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
传递给报告。呃...我希望这是有道理的。
答案 0 :(得分:5)
你走在正确的轨道上。
如果您查看report_data标签,则会看到参数文件夹。展开它,您应该看到初始查询中的所有参数。右键单击EMPLNAME参数,选择参数属性,转到可用值并执行以下配置:
同样,在常规选项卡上,将参数标记为接受空值
现在,诀窍在于NAMES数据集。您必须选择所有名称,以及具有空值的行。有几种方法可以实现它,最简单的方法是在查询中添加以下内容:
union SELECT null as [EMPL ID], 'NULL' as [EMPL NAME]
如果不这样做,报告会抱怨参数不能为空。
结果(为简单起见,我只添加了2个参数):
答案 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