【问题标题】:SSRS sending parameters to a custom stored procedure querySSRS 将参数发送到自定义存储过程查询
【发布时间】: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,以为报告收集查询输出的存储过程?)

【问题讨论】:

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


【解决方案1】:

在参数属性上设置“允许 null”,并可选择将除一个参数以外的所有参数的默认值设置为 null。

顺便说一句:我会考虑更改参数名称,以便更容易理解。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多