1

今天,在使用 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

上面的存储过程要求一个 Parameter Named CLOSECODE,并根据提供的值,例如“0”或“01”或“02”,它从相应的表中返回所需的字段。返回的字段因该参数而异。

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

数据集截图

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

结果截图

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

4

2 回答 2

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

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

在此处输入图像描述

于 2013-04-29T13:25:18.403 回答
0

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

长答案:我已经为 SSRS 报告编写了数百个 Proc,我们使用参数来控制要输出到报告的数据集,因此我们可以在报告中拥有多个数据集,以及从相同的过程。因此,Proc 和报告正在循环往复以提供数据。在这种情况下,当您点击 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 变量中提取正确的字段列表。

我的新程序是将其复制到我的过程的开头...

If (@Datasetflag = "Dummy") Begin Select getdate() as DummyDate into #TempDummy

Select DummyDate from #TempDummy

结束 ELSE.... 真正的 if 就从这里开始...

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

于 2016-08-17T14:36:35.750 回答