SSRS中的多个报告使用相同的存储过程

时间:2015-06-23 15:55:54

标签: sql sql-server stored-procedures reporting-services ssrs-2012

我有一个SSRS项目,其中多个报告使用相同的存储过程。所有报告都不同(显然),但数据来源相同。

例如,一个报表是一个较大的表格事务报表,包含50多个字段和20多个参数,一个报表是一个参数,一个页面报表基本上只是在详细视图中显示一条记录。很少有其他报告与第一个(表格)报告非常相似,但大多数参数都是默认和隐藏的,它们使用存储过程中的不同字段。

所有这些报告都使用相同的存储过程(比如sp_Transaction),它有20多个参数并返回100多个字段。在存储过程中处理参数的方式如下:

(
    ( 
        tblTransaction.TransactionID = @TransactionId
    )
    OR
    (
        @TransactionId IS NULL
        AND
        (
            @DateCreatedDaysRelative IS NULL
            OR
            (CAST(tblTransaction.Created AS DATE)) = CAST(DATEADD(DAY, @DateCreatedDaysRelative, GETDATE() ) AS DATE)
        )
        AND
        (
            (
                @DateStartMonthsRelative IS NULL
                AND @DateEndMonthsRelative IS NULL
            )
            OR
            ( 
                tblTransaction.DateStart <= DATEADD(MONTH, @DateStartMonthsRelative, GETDATE() )
                AND ( tblTransaction.DateEnd >= DATEADD(MONTH, @DateEndMonthsRelative, GETDATE() ))
            ) 
        )
    )
)

AND
(
    tblTransaction.Receipt = @ReceiptRequired
    OR @ReceiptRequired IS NULL
)
AND
(
    @PubID = dbo.tblJournal.PubID
    OR @PubID IS NULL
)

我理解它很容易维护所有报告都有一个代码,但它是一个很大的存储过程,需要大量的参数并返回很多字段而非报告(使用它)实际上使用它的所有参数或字段。

所以我的问题是'一个好的做法是拥有一个共同的大部分代码,其中一半的输入和输出没有被使用(一次只有一个报告)或只为每个报告创建单独的存储过程输入和输出;或其他类似于一个存储过程但使用动态sql?

2 个答案:

答案 0 :(得分:2)

这不是一个简单的是/否问题。

你必须考虑很多因素,就像很多其他事情一样,你不应该过度使用它。

我会说坏主意是:

  • 始终使用单独的查询/ SP
  • 始终使用相同的查询/ SP

在这两个选项之间放置光标的位置(主要是创建新查询或主要使用相同的查询)取决于您。

两者都有利有弊,我最重要的是:

单独查询/ SP

  • PRO:为处理“有用”数据的每个报告量身定制的查询
  • CON:如果需要更新(例如更改列名或需要新列),则必须更新x个查询而不是仅更新1个

相同查询/ SP

  • PRO:更新可能会影响所有报告,因此您的工作量较少
  • CON:更新可能会影响所有报告,因此您可以产生副作用

答案 1 :(得分:2)

这是非常简单是/否问题。这是一个可怕的,可怕的想法

维护是一个您不想处理的重要问题,在任何更改之后测试包含所有参数的每个报告都是一场噩梦,也是引入错误的好方法。

同样,如果不是更重要的问题是效果。此proc不会以任何方式扩展。它不能使用索引,因为where子句中的函数需要为每一行进行求值。 (有一些方法可以缓解这个问题,但这只会使代码更少可读)

报告是否经常运行,是否为每次执行重新编译?执行计划不太可能对所有参数都有效,但如果计划被缓存,则使用不同的参数调用proc将以未知方式影响运行时间。 (同样,有一些方法可以减轻这种影响,但代码可读性会受到影响)

肯定有理由使用共享数据集并重新使用存储过程,但为所有报告设置超级存储过程是一个坏主意。