【发布时间】:2015-06-23 15:55:54
【问题描述】:
我有一个 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 的东西?
【问题讨论】:
-
这闻起来像是一场维护噩梦。您将如何记住此过程的哪个部分与哪个报告相关联?如果你问这个问题,听起来你已经怀疑这不是一个好主意。
-
当有很多参数和/或名称不清楚时,在 SSRS 中弄乱参数映射可能会更容易一些。也许您只需要将一些更复杂的检查隔离到它们自己的过程或函数中,以便可以共享它们。
-
我完全同意@onskee!如果您被其他因素强制维护单个脚本,请记住 WITH RECOMPILE 选项可能会提高性能:msdn.microsoft.com/en-us/library/ms190439.aspx
标签: sql sql-server stored-procedures reporting-services ssrs-2012