繁体   English   中英

SSRS - 在我的查询中忽略SQL变量

[英]SSRS - Ignore SQL Variables in my query

我有一个在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 )并忽略@StartDate@EndDate因为它们是在查询中计算出来的?

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

select thing 
from table 
where item = @Parm1

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

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

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

  2. 将变量设置为'allow nulls'并处理空引用。

编辑(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

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

为查询中尚未在查询中声明的任何变量的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可能对资本化很挑剔。 确保它们在您的声明和您对变量的使用之间匹配。

保留报告中的参数,但为它们提供默认值并将其设置为“隐藏”。

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

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

将过程包装到nvarchar(max)变量中,然后执行它:

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

exec sys.execsql(@statement)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM