【问题标题】:SSRS DataSet not Asking for Parameter ValuesSSRS 数据集不要求参数值
【发布时间】:2016-08-17 23:20:09
【问题描述】:

今天,在使用 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 中定义如下数据集时:

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

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

【问题讨论】:

  • 您是否检查了参数的默认值?在任何情况下,您都应该缩小您的实际问题范围(例如一些binary debugging)并帮助我们创建一个sscce。目前对我们来说有点猜谜游戏。
  • 是的,我也尝试了全新报告。而且,问题是一样的。而且,存储过程也不包含任何默认值。
  • 当您将Query type 设置为存储过程而不是文本时会发生什么?
  • 是的,我也试过了..但问题也一样:)。存储过程本身在带有这些参数的 SSMS 中运行良好。
  • 为什么不使用向导中的存储过程选项而不是文本来定义数据集?需要设置您的数据源。

标签: reporting-services ssrs-2008-r2


【解决方案1】:

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

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

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

忽略为什么不要求您输入参数(同样,这对我来说并不罕见),我可以想到几个选项:

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:手动添加缺失的列。

您可以在设计器中手动将更多列添加到数据集中:

【讨论】:

  • 在我的情况下,似乎正在发生的事情是我的过程最初返回了一个结果集,即使所有参数都是 NULL,并且 SSRS 似乎首先尝试了这个。当我更改我的过程以使其在所有参数均为 NULL 时不返回 any 结果集(甚至是空的)时,SSRS 开始提示我输入参数。我猜它巧妙地尝试不使用任何参数进行探测,并且如果它没有从最初的尝试中获得任何信息,只会提示一些参数。
【解决方案2】:

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

长答案: 我已经为 SSRS 报告编写了数百个 Proc,我们使用参数来控制要输出到报告的数据集,因此我们可以在报告中拥有多个数据集,以及从同一个 proc 中提取参数和数据。所以 Proc 和 report 来回循环提供数据。在这种情况下,当您点击 REFRESH Fields 时,它应该会询问您的控制参数(我们称为 @DatasetFlag)所以在这种情况下,我将“Dataset1”放在@DatasetFlag 中,并且在 proc 中,我们有 IF @DatasetFlag = "Dataset1" Begin xxxxx End ELSE If @DatasetFlag = "Dataset2" Begin END ESLE 等等... 这里是 SSRS 如果时髦的话。有时它会询问参数,有时它不会,在这种情况下(不询问)它只会获取第一个结果集并使用这些字段!或者更好,但保持空置!

我确实找到了一个可能的解决方案来强制它询问,它确实有效!

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

我的新例程是将其复制到我的进程的开头...

如果 (@Datasetflag = "虚拟") 开始 选择 getdate() 作为 DummyDate 进入#TempDummy

Select DummyDate from #TempDummy

结束 别的.... 真正的如果从这里开始......

这会强制 REFRESH FIELDS 始终要求提供参数,然后动态拉入字段并让我更快地创建报告...无需手动输入 50 多个字段条目!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-02
    • 1970-01-01
    • 2018-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-09
    相关资源
    最近更新 更多