3

我正在寻找一种将值添加到从简单查询中检索到可用值的参数的方法。我今天才开始搞乱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 Business Intelligence Development Studio)。一个从上述过程生成 (RAW_TIME_DATASET),另一个从同一视图查询以填充员工 ID 和姓名 (NAMES):

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

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

4

2 回答 2

6

你在正确的轨道上。

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

在此处输入图像描述

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

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

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

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

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

在此处输入图像描述

于 2012-05-01T08:31:20.727 回答
1

编辑:请注意,此答案仅在选择在数据集中时才有效,但在选择在存储过程中时无效。请参阅答案下方的评论。

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

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

我相信SSRS会(@EMPLNAME)在执行查询之前用逗号分隔的列表替换该位(您不能在常规(非动态)SQL afaik中使用此“IN @param”语法。因为员工姓名是一个字符串,请注意警告链接的 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
于 2012-04-30T22:12:19.500 回答