嘿,所有人第一次处理SSRS的精彩世界。我正在使用报告构建器,以便根据我的需要创建报告。
创建空白表后,我继续创建数据源:
工作正常并连接。所以我继续创建一个数据集:
它再次找到我需要的存储过程并连接到它。现在在数据集文件夹下,它看起来像这样:
哪个是正确的......但同时 - 不正确。
现在参数文件夹如下所示:
这又是正确的,但我似乎无法在报告页面上使用它。它看到它需要所有这些参数才能传递给查询(在这种情况下它只需要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,到收集报告查询输出的存储过程?)
答案 0 :(得分:0)
设置'允许null'在参数属性上,并可选择将除一个参数之外的所有参数设置为null。
BTW:我考虑更改参数名称,以便更容易理解。