【发布时间】:2018-04-08 07:00:53
【问题描述】:
大家好,第一次接触 SSRS 的精彩世界。我正在使用报告生成器来创建我的报告以满足我的需要。
在创建一张空白表后,我继续创建了我的数据源:
它工作得很好并且可以连接。所以我继续创建一个数据集:
它再次找到我需要的存储过程并连接到它。现在在 Datasets 文件夹 下看起来像这样:
这是正确的......但同时 - 不正确。
现在 Parameters 文件夹如下所示:
这又是正确的,但我似乎无法在我的报告页面上使用它。它认为它需要所有这些参数才能传递给查询(在这种情况下它只需要 1,即用户 ID)。
所以我在空白报告页面内右键单击并选择插入 -> 表格 并在页面上放置一个表格。当仅将 val1 拖到报告页表并运行它时 - 这是我得到的输出:
它会将所有 1 作为“查询输出”,而实际上这是参数输入,以便查询有关该用户 ID 的返回信息。
我的存储过程看起来像这样(由于它很大而被削减):
USE [B2017]
GO
/****** Object: StoredProcedure [dbo].[spFetchApproved] Script Date: 10/26/2017 2:26:09 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[spFetchPending] (
@val1 VARCHAR(100) = null,
@val2 VARCHAR(100) = null,
@val3 VARCHAR(100) = null,
@val4 VARCHAR(100) = null,
@val5 VARCHAR(100) = null
)
AS
BEGIN TRY
SET NOCOUNT ON;
DECLARE @version VARCHAR(30);
SET @version = OBJECT_NAME(@@PROCID);
/************************************/
/* The Query */
/* 1=text | 2=datetime | 3=else */
/************************************/
EXEC [dbo].[_chkQ]
'SELECT
BL.number,
BL.line,
tOf.name AS type,
E.name AS environment
[more code here....]
WHERE
LINK_userTblID = @val1
AND
stage = 2
GROUP BY
[more code here.....]',
@version,
@val1, 3
END TRY
BEGIN CATCH
/************************************/
/* Get Error results back */
/************************************/
SELECT
ERROR_NUMBER() AS ErrorNumber,
ERROR_SEVERITY() AS ErrorSeverity,
ERROR_STATE() AS ErrorState,
ERROR_PROCEDURE() AS ErrorProcedure,
ERROR_LINE() AS ErrorLine,
ERROR_MESSAGE() AS ErrorMessage;
/************************************/
END CATCH
还有对 [dbo].[_chkQ] 的引用(也被删减了):
USE [B2017]
GO
/****** Object: StoredProcedure [dbo].[_chkQ] Script Date: 10/26/2017 2:57:20 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[_chkQ] (
@ParameterSQL VARCHAR(MAX),
@ver VARCHAR(30),
@val1 VARCHAR(MAX) = null,
@val1Type int = null,
@val2 VARCHAR(MAX) = null,
@val2Type int = null,
[more code here...]
)
AS
DECLARE @SQL NVARCHAR(MAX);
DECLARE @IDENTITY INT;
BEGIN
IF (@val1 IS NOT NULL)
BEGIN
IF (@val1Type = 1)
SET @ParameterSQL = replace(@ParameterSQL, '@val1', '''' + @val1 + '''');
ELSE IF (@val1Type = 2)
SET @ParameterSQL = replace(@ParameterSQL, '@val1', '''' + @val1 + '''');
ELSE
SET @ParameterSQL = replace(@ParameterSQL, '@val1', @val1);
END
IF (@val2 IS NOT NULL)
[more code here...]
END
print @ParameterSQL
IF CHARINDEX('INSERT ', @ParameterSQL) > 0
BEGIN
SET @SQL = @ParameterSQL;
EXECUTE sp_executesql @SQL;
SET @IDENTITY = (SELECT @@IDENTITY AS Returned);
END
ELSE IF CHARINDEX('DELETE ', @ParameterSQL) > 0
[more code here...]
PRINT @SQL;
DECLARE @ExitSQL NVARCHAR(MAX);
SET @ExitSQL =
'SELECT
CONCAT(
OBJECT_NAME(@@PROCID),
'' '',
LEFT(modify_date, 11),
'' ('',
DATEDIFF(day, LEFT(modify_date, 11), GETDATE()),
'' days ago)''
) AS CurrentVersion,
CONCAT(' + CHAR(39) +
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(@SQL, CHAR(13), ''),
CHAR(10), ''),
' ', ''),
' ', ''),
'''', '''''') +
CHAR(39) +
', '''') AS theQuery
FROM
sys.objects
WHERE
type = ''P''
AND
name = ''' + @ver + '''';
EXECUTE sp_executesql @ExitSQL
所以我通常在我的 ASP.net 页面中所做的只是调用存储过程并将 SP 需要的值发送给它。但是,这里似乎没有让我这样做的选项?
我怎样才能像我需要的那样构建我的报告(设计方面),并且还能够从我的 ASP.net 页面调用它来填充它(这意味着发送一个参数,在这种情况下,1 作为用户 ID,以为报告收集查询输出的存储过程?)
【问题讨论】:
-
使用 ReportViewer 控件
-
对不起,我想把 ASP.net MVC @WEI_DBA。顺便说一句,这并不能帮助我构建设计中的报告。
标签: sql-server asp.net-mvc stored-procedures reporting-services ssrs-2016