6

我有一个在 SQL 中运行良好的查询。当我尝试将其引入 SSRS 时,报告要求提供 4 个参数。其中两个参数/变量实际上基于其他两个参数,如下所示:

DECLARE @Q int       --SET @Q = 1 -- Quarter 
DECLARE @Year int    --SET @Year = 2013

DECLARE @STARTDATE varchar(10)
SELECT @STARTDATE = D FROM (
    select case @Q
        when 1 then '1/1/' + convert(varchar(10),@Year)
        when 2 then '4/1/' + convert(varchar(10),@Year)
        when 3 then '7/1/' + convert(varchar(10),@Year)
        when 4 then '10/1/' + convert(varchar(10),@Year)
    end as D
    ) sd

DECLARE @ENDDATE varchar(10)
SELECT @ENDDATE = D FROM (
    select case @Q
        when 1 then '3/31/' + convert(varchar(10),@Year)
        when 2 then '6/30/' + convert(varchar(10),@Year)
        when 3 then '9/30/' + convert(varchar(10),@Year)
        when 4 then '12/31/' + convert(varchar(10),@Year)
    end as D
    ) ed

--(ADDITIONAL SQL CONTINUES USING ALL 4 PARAMETERS) ...

如何让 SSRS 只询问前两个参数 ( @Q, @Year) 并忽略@StartDateand ,@EndDate因为它们是在查询中计算的?

4

6 回答 6

2

将参数保留在报告中,但给它们一个默认值并将它们设置为隐藏。

当查询运行时,代码将覆盖@STARTDATE@ENDDATE值,因此默认值无关紧要。

于 2013-04-09T19:52:24.063 回答
2

每当您在 SSRS 中添加 select 语句时,如果您粘贴到 select 语句中,默认情况下通常会为您添加参数,例如:

select thing 
from table 
where item = @Parm1

然后它应该在“报表数据”下的报表设计器屏幕上显示“参数”文件夹。如果带有该值的参数不存在,则需要添加它才能使您的主体工作。SSRS 中的参数选择与 SQL 中的不同。您可以在它们自己的部分中定义它们。

如果您希望它忽略两个参数,为什么必须包含它们?这似乎有点违反直觉。你有两个选择:

  1. 在声明变量的地方,将参数的“默认值”设置为静态值。

  2. 将变量设置为“允许空值”并处理空引用。

编辑(下面有 CTE):

在 SSRS 你不这样做(一般来说,有时你可能需要一个表变量,这很好或其他静态):

Declare @Var int;

select thing
from table
where item = @Var

你只需这样做:

select thing
from table
where item = @Var

然后,您将“参数”作为具有类型和确定性结果的自己的属性来处理。

我会在 SSRS 的数据集中这样做:

with dates as 
(
select 
case @Q
    when 1 then '1/1/' + convert(varchar(10),@Year)
    when 2 then '4/1/' + convert(varchar(10),@Year)
    when 3 then '7/1/' + convert(varchar(10),@Year)
    when 4 then '10/1/' + convert(varchar(10),@Year)
end as StartDate
,   case @Q
    when 1 then '3/31/' + convert(varchar(10),@Year)
    when 2 then '6/30/' + convert(varchar(10),@Year)
    when 3 then '9/30/' + convert(varchar(10),@Year)
    when 4 then '12/31/' + convert(varchar(10),@Year)
end as EndDate
)
select things 
from mainbodytable, dates  -- CTE reference
where date between StartDate and EndDate -- referenced from CTE above

确保您看到为“Q”和“Year”列出的参数存在于“Parameters”文件夹下,并将它们设置为整数。当用户运行报告时,它会询问这些值,只要它们是范围内的合法值,他们就会确定数据集。EG:它们不是将返回空值的无效值。

于 2013-04-09T19:02:19.050 回答
2

为查询中未在查询中声明的任何变量添加查询 SSRS 数据集的参数。

但是一旦添加它们,它们并不总是自动删除,因此您可能需要从数据集查询中手动删除它们。

例如,这个查询只会为@ParamOne 创建参数:

DECLARE @StartDate, @EndDate DATETIME

SET @StartDate = 'January 1, 2013'
SET @EndDate = 'February 1, 2013'

SELECT
   UserName,
   Action,
   DateOccurred
FROM
   myTable
WHERE
   DateOccurred BETWEEN @StartDate AND @EndDate
AND UserName = @ParamOne

但是 SSRS 可能对大小写很挑剔。确保它们在您的声明和变量的使用之间匹配。

于 2013-04-09T19:03:39.287 回答
0

您是否将查询放入存储过程中?(如果你不是,你应该这样做,这只是一个好习惯)。如果您使用 proc,则可以只有两个输入变量,然后根据需要声明尽可能多的其他内部变量。

于 2013-04-09T19:00:12.917 回答
0

将过程包装成一个nvarchar(max)变量,然后执行它:

declare @statement nvarchar(max)
set @statement='....
'

exec sys.execsql(@statement)
于 2018-02-16T17:20:36.110 回答
-1

我认为这是不可能的,因为 SSRS 创建了一个dynamic查询并将所有变量转换为参数。所以 AFAIK 唯一的选择是将查询包装在stored procedure

于 2013-04-09T18:54:31.950 回答