SSRS将参数发送到自定义存储过程查询

时间:2017-10-26 19:09:06

标签: sql-server asp.net-mvc stored-procedures reporting-services ssrs-2016

嘿,所有人第一次处理SSRS的精彩世界。我正在使用报告构建器,以便根据我的需要创建报告。

创建空白表后,我继续创建数据源

enter image description here

工作正常并连接。所以我继续创建一个数据集

enter image description here

它再次找到我需要的存储过程并连接到它。现在在数据集文件夹下,它看起来像这样:

enter image description here

哪个是正确的......但同时 - 不正确。

现在参数文件夹如下所示:

enter image description here

这又是正确的,但我似乎无法在报告页面上使用它。它看到它需要所有这些参数才能传递给查询(在这种情况下它只需要1,即用户ID)。

enter image description here

所以我在空白报告页面内右键单击并选择插入 - >表并在页面上放置一个表格。将 val1 拖动到报表页面表并运行它时 - 这是我得到的输出:

enter image description here

它确实将所有 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,到收集报告查询输出的存储过程?)

1 个答案:

答案 0 :(得分:0)

设置'允许null'在参数属性上,并可选择将除一个参数之外的所有参数设置为null。

BTW:我考虑更改参数名称,以便更容易理解。