SSRS DataSet不要求参数值

时间:2013-04-29 07:24:55

标签: reporting-services ssrs-2008-r2

今天,在使用SSRS时,我遇到了一个惊人的问题。我仍然无法找到问题所在。 好吧,我有一个存储过程:

ALTER PROCEDURE [dbo].[S_MEMBER_DROP_OUT_REPORT](@DTNAME VARCHAR(50),
                                                 @BRCODE VARCHAR(3),
                                                 @F_DATE VARCHAR(10),
                                                 @T_DATE VARCHAR(10),
                                                 @CLOSECODE VARCHAR(50),
                                                 @CENTRALIZED VARCHAR(3))
WITH RECOMPILE
AS BEGIN

SET NOCOUNT ON;
DECLARE @DTBASE VARCHAR(50)
DECLARE @CLOSEOPT VARCHAR(50)
SET @DTBASE=''

IF @CENTRALIZED='YES'
    SET @DTBASE = @DTNAME
ELSE
    SET @DTBASE = Left(@DTNAME, 13) + @BRCODE

IF @CLOSECODE ='0'
    BEGIN
        Exec (' 
                SELECT T1.CENTER_CODE + '' - '' + CTR.CENTER_NAME AS CENTER,COUNT(DISTINCT T1.CUSTOMER_CODE) AS CNT 
                FROM 
                    (SELECT * FROM CENTER W WHERE BR_CODE='''+@BRCODE+''') AS CTR,
                    (SELECT A1.CENTER_CODE,A1.CUSTOMER_CODE,A2.CLOSE_CODE,A2.CLOSE_DESC_CODE,MAX(A2.CLOSE_DATE) AS REDG_DATE,MAX(A2.TRAN_ID) AS TRAN_ID FROM '+@DTBASE+'.dbo.CENTER_GROUP_MEMBER AS A1, '+@DTBASE+'.dbo.CUST_REDG_HIST A2,'+@DTBASE+'.dbo.CUST_STATUS_HIST A3
                        WHERE A2.CUST_STATUS_CODE=''04'' AND A2.CLOSE_CODE<>''03'' 
                        AND A1.BR_CODE='''+@BRCODE+''' AND A2.BR_CODE='''+@BRCODE+'''
                        AND (A2.CLOSE_DATE BETWEEN '''+@F_DATE+''' AND '''+@T_DATE+''')
                        AND A1.CUSTOMER_CODE=A2.CUSTOMER_CODE 
                        AND A1.CUSTOMER_CODE=A3.CUSTOMER_CODE AND A1.CENTER_CODE=A3.CENTER_CODE AND A1.GROUP_CODE=A3.GROUP_CODE
                        AND A3.TRAN_ID=(SELECT TOP 1 TRAN_ID FROM '+@DTBASE+'.dbo.CUST_STATUS_HIST CSH WHERE A3.CUSTOMER_CODE=CSH.CUSTOMER_CODE ORDER BY TRAN_ID DESC)
                    GROUP BY A1.CENTER_CODE,A1.CUSTOMER_CODE,A2.CLOSE_CODE,A2.CLOSE_DESC_CODE
                    ) AS T1 
                WHERE T1.CENTER_CODE=CTR.CENTER_CODE
                GROUP BY T1.CENTER_CODE,CTR.CENTER_NAME
                ORDER BY T1.CENTER_CODE
             ') 
    END
ELSE
    BEGIN       
        IF LEN(@CLOSECODE) > 0 SET @CLOSEOPT=' AND A2.CLOSE_CODE IN ('+@CLOSECODE+')' ELSE SET @CLOSEOPT=''
        Exec (' 
                SELECT T1.CENTER_CODE + '' - '' + CTR.CENTER_NAME AS CENTER,CCC.CLOSE_NAME,CCD.CLOSE_DESC_NAME AS CLOSE_DESC,COUNT(DISTINCT T1.CUSTOMER_CODE) AS CNT FROM 
                    (SELECT * FROM '+@DTBASE+'.dbo.CUST_CLOSE_CAUSE) AS CCC,
                    (SELECT * FROM '+@DTBASE+'.dbo.CUST_CLOSE_DESC) AS CCD,
                    (SELECT * FROM CENTER WHERE BR_CODE='''+@BRCODE+''') AS CTR,
                    (SELECT A1.CENTER_CODE,A1.CUSTOMER_CODE,A2.CLOSE_CODE,A2.CLOSE_DESC_CODE,MAX(A2.CLOSE_DATE) AS REDG_DATE,MAX(A2.TRAN_ID) AS TRAN_ID FROM '+@DTBASE+'.dbo.CENTER_GROUP_MEMBER AS A1,'+@DTBASE+'.dbo.CUST_REDG_HIST A2,'+@DTBASE+'.dbo.CUST_STATUS_HIST A3
                        WHERE A2.CUST_STATUS_CODE=''04'' '+@CLOSEOPT+'
                        AND A1.BR_CODE='''+@BRCODE+''' AND A2.BR_CODE='''+@BRCODE+'''
                        AND (A2.CLOSE_DATE BETWEEN '''+@F_DATE+''' AND '''+@T_DATE+''')
                        AND A1.CUSTOMER_CODE=A2.CUSTOMER_CODE 
                        AND A1.CUSTOMER_CODE=A3.CUSTOMER_CODE AND A1.CENTER_CODE=A3.CENTER_CODE AND A1.GROUP_CODE=A3.GROUP_CODE
                        AND A3.TRAN_ID=(SELECT TOP 1 TRAN_ID FROM '+@DTBASE+'.dbo.CUST_STATUS_HIST CSH WHERE A3.CUSTOMER_CODE=CSH.CUSTOMER_CODE ORDER BY TRAN_ID DESC)
                    GROUP BY A1.CENTER_CODE,A1.CUSTOMER_CODE,A2.CLOSE_CODE,A2.CLOSE_DESC_CODE
                    ) AS T1 
                WHERE T1.CLOSE_DESC_CODE =CCD.CLOSE_DESC_CODE 
                AND T1.CLOSE_CODE =CCC.CLOSE_CODE 
                AND T1.CENTER_CODE=CTR.CENTER_CODE
                GROUP BY T1.CENTER_CODE,CCD.CLOSE_DESC_NAME,CCC.CLOSE_NAME,CTR.CENTER_NAME 
            ')  
    END
END

GO

上述存储过程要求输入名为CLOSECODE的参数,并根据提供的值,例如'0'或'01'或'02'它从适当的表中返回所需的字段。 返回的字段因参数而异。

当我在SSRS中定义数据集时,如下所示:

dataset screenshot

它不是要求任何参数值,而是默认生成以下字段:

result screenshot

我尝试了所有我想到的问题是什么。但仍然无法解决这个问题。而且,实际上,我想知道,为什么SSRS表现得像今天这样。我正在使用它自2-3个月以来我到目前为止设计了很多这样的报告,其中包含动态查询,存储过程中的字段,但没有任何问题,但这个。

2 个答案:

答案 0 :(得分:1)

当SSRS确定SP数据集的字段(至少高达2008R2)时,它将使用SET FMTONLY ON调用基础SP。这只返回结果集元数据,而不是所有数据。

似乎SSRS确定是否需要询问参数 - 在您的情况下似乎不是。根据我的经验,我只会在SP中涉及临时表时收到提示 - 我在这里找不到任何解释。

数据集的问题在于,从SP返回的列有两组可能的列,它只获得第一列,只返回两列 - 这就是您在上面看到的内容。 SSRS只是命中第一个返回点,它有两列,并忽略任何其他可能的select语句。

忽略你没有被要求输入参数的原因(再次,这对我来说并不罕见),我可以想到几个选项:

1:调整您的SP以确保运行任何语句,始终返回相同的列。

所以,在你第一个可能的陈述中,我会改变

IF @CLOSECODE ='0'
    BEGIN
        Exec (' 
                SELECT T1.CENTER_CODE + '' - '' + CTR.CENTER_NAME AS CENTER
                  ,COUNT(DISTINCT T1.CUSTOMER_CODE) AS CNT 
                FROM

要包含所有必需的列 - 这样SSRS将始终获取正确的元数据。如下所示:

IF @CLOSECODE ='0'
    BEGIN
        Exec (' 
                SELECT T1.CENTER_CODE + '' - '' + CTR.CENTER_NAME AS CENTER
                  ,COUNT(DISTINCT T1.CUSTOMER_CODE) AS CNT
                  ,CAST(NULL AS VARCHAR(100)) AS CENTER
                  ,CAST(NULL AS VARCHAR(100)) AS CLOSE_NAME
                  ,CAST(NULL AS VARCHAR(100)) AS CLOSE_DESC
                  ,... -- Extra columns as required
                FROM

2:手动添加缺少的列。

您可以在Designer中手动添加更多列到数据集中:

enter image description here

答案 1 :(得分:0)

简答:将第一个结果集放入proc中的#TempTable,然后再次开始提示SSRS中的参数!

长答案: 我已经为SSRS报告编写了HUNDREDS,其中我们使用参数来控制输出到报告的数据集,因此我们可以在报告中包含多个数据集,以及从中获取参数和数据同样的过程。因此,Proc和报告将循环返回以提供数据。在这种情况下,当你点击REFRESH字段时,它应该询问你的控制参数(我们称之为@DatasetFlag)所以在这种情况下,我把&#34; Dataset1&#34;在@DatasetFlag中,在proc中,我们有IF @DatasetFlag =&#34; Dataset1&#34;开始xxxxx结束ELSE如果@DatasetFlag =&#34;数据集2&#34;开始END ESLE等等...... 这是SSRS如果时髦的地方。有时它要求参数,有时它不会,在这种情况下(不要求)它只会抓取第一个结果集并使用这些字段!或者更好,但保持空虚!

我确实找到了一个可能的解决方案,提示它要问它,它确实有效!

您必须在TEMP表中选择您的数据(即#temptable1),然后它将再次开始询问!因此,至少FIRST结果集必须使用TEMP表,然后在那时,它确实从@DatasetFlag变量中提取正确的字段列表。

我的新例程是将其复制到我的proc ...

的开头

if(@Datasetflag =&#34; Dummy&#34;) 开始     选择getdate()作为DummyDate      进入#TempDummy

Select DummyDate from #TempDummy

端 其他.... 真正的if,然后从这里开始......

这会强制REFRESH FIELDS始终为参数设置ASK,然后动态地拉动字段并让我更快地创建报告...没有手动输入50多个字段条目!