【问题标题】:SSRS Dataset parameters not workingSSRS 数据集参数不起作用
【发布时间】:2014-12-02 23:08:30
【问题描述】:

所以下面是我的问题的一个示例,其中没有任何数据。我遇到了一个问题,我创建了一个带有 IF 的存储过程,以便一个参数指示我在 SSRS 中创建的数据集,但是当我在 SSRS 中传递参数我没有得到我请求的数据集。我的示例脚本如下:

USE [InfoPortal]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO


CREATE PROCEDURE [dbo].[usp_Report_SSRSTest]  
    ( 
        @ReportType         VARCHAR(255)    = NULL
    ,   @Debug              VARCHAR(1)  = NULL
)
AS

BEGIN

SET NOCOUNT ON
SET FMTONLY OFF


CREATE TABLE #data1
(
number      INT
,text1      VARCHAR(100)
,text2      VARCHAR(300)
)

CREATE TABLE #data2
(
number      INT
,text3      VARCHAR(100)
,text4      VARCHAR(300)
)



IF @ReportType = 'Y'
    BEGIN

        SELECT
                number
            ,   text1
            ,   text2

        FROM #data1

    END
ELSE

    BEGIN

        SELECT
                number
            ,   text3
            ,   text4

        FROM #data2

    END

END

所以当我进入数据集 > 添加数据集时,我选择“存储过程”的“查询类型”并选择上面的存储过程。然后我转到参数,在@ReportType 中输入“Y”,在@Debug 中输入“N”。我单击刷新字段,然后确定。但是,与其将“Y”传递给存储过程,它似乎没有传递任何内容,因为我将存储过程的 ELSE 部分作为数据集中的可用字段返回。当我尝试使用@ReportType“N”和@Debug“N”时,我得到了我需要的可用字段,但我假设这是因为它将NULL 传递给@ReportType。

我有什么遗漏吗?

当我使用与上述相同的参数运行 proc SSMS 时,我得到了我需要的数据集。当我在 SSRS 的查询设计器中运行存储过程时,它也很好。

那么为什么即使我将参数设置为数据集属性中的值,我的报告也会将 NULL 作为参数传递给存储过程?

【问题讨论】:

  • 你提到it seems to be passing nothing,你确认了吗?使用SQL Server Profiler确定这是正确的。
  • 感谢@t_m 的回复。是的,我们已经运行了探查器,似乎在参数中传递了一个 NULL,即使我们在数据集属性中设置了它。

标签: sql tsql stored-procedures reporting-services ssrs-2008


【解决方案1】:

当您在数据集属性中时,它不会传递任何值,但会从存储过程中检索元数据。

您需要更改存储过程以返回相同的列。

更改表定义,使#Data2 与#Data1 具有相同的列名..

CREATE TABLE #data1
(
number      INT
,text1      VARCHAR(100)
,text2      VARCHAR(300)
)

CREATE TABLE #data2
(
number      INT
,text3      VARCHAR(100)
,text4      VARCHAR(300)
)

-- Modified to add data
INSERT INTO #data1 (number, text1, text2)
SELECT 1, 'text1', 'text2'

INSERT INTO #data2 (number, text3, text4)
SELECT 2, 'text3', 'text4'


IF @ReportType = 'Y'
BEGIN

    SELECT
            number
        ,   text1
        ,   text2
    FROM #data1
END
ELSE
BEGIN
    SELECT
            number
        ,   text3 AS text1   -- **MODIFIED**
        ,   text4 AS text2   -- **MODIFIED**
    FROM #data2

END

END

如果这不是您想要的,那么您需要提供更多信息,为什么您希望根据参数从一个数据集返回 text1, text2 并从另一个数据库返回 text3, text4。

【讨论】:

  • 感谢@t_m 的回复。不过,这并不是我真正理解它的工作方式。在数据集属性中设置参数有什么意义?我需要在我的数据集中返回 text1、text2 和在另一个中返回 text3、text4,因为它们是完全不同的列,返回完全不同的字段。在您的回答中,我必须更改所有单列标题以在其中包含 IIF,以根据传递的参数更改列名。好像有点奇怪。
  • 我相信您误解了 SSRS 和数据集的工作原理。在设计时,报告会获取您设计报告所需的列元数据。如果没有对列元数据的初始引用,您将无法使用这些列。无法获取所有列元数据以在当前逻辑中设计报表。因此,您可以在您拥有的逻辑中使用Text1, Text2 或Text3, Text4。
  • 是的,但我不想要所有的列。假设我只想要包含 text1 和 text2 列的数据集,你是说我不能在数据集属性中将 @ReportType 的参数传递为“Y”?因为如果我这样做了,它只会返回上面逻辑中当前具有 text3 和 text4 的数据集。这就是我目前的问题所在。
  • 我已经修改了答案。您可以使用@ReportType 检索所需的数据集,但返回的列必须相同。答案修改为使用别名返回相同的列名,无论@ReportType 是Y 还是N。你为什么不试一试。
猜你喜欢
  • 2020-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-09
  • 2020-04-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多