以下是我的问题的一个示例,没有任何数据。我遇到了一个问题,我已经创建了一个带有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中的Query Designer中运行存储过程时,它也没关系。
那么,为什么我的报告会将NULL作为参数传递给存储过程,即使我将参数设置为数据集属性中的值?
答案 0 :(得分:0)
当您在数据集属性中时,它不会传递任何值,但会从存储过程中检索元数据。
您需要更改存储过程以返回相同的列。
更改表定义,以便#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
。