[英]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不同。 您可以在自己的部分中定义它们。
如果您想要忽略两个参数,为什么必须包含它们? 这似乎有点反直觉。 您有两种选择:
声明变量的位置将参数的“默认值”设置为静态值。
将变量设置为'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.