CRM报告的标量和表值函数

时间:2014-11-07 14:40:22

标签: sql-server reporting-services crm user-defined-functions

我的报告是从Microsoft CRM网站上运行的。之前使用JavaScript计算报告所需的值并保存到SQL。事实证明,这些计算是不可靠的,往往是不正确的。因此,转向执行SQL Server报告所需的计算而不是JS。

目前,已经创建了几个标量函数来执行这些计算,其中包含计算值所需的x个参数。第一个问题是那些函数可能需要参数,这些参数需要由基函数内的附加函数使用。例如:

CREATE FUNCTION SomeCalculation
    (@FuncParam1 int, 
     @FuncParam2 int,
     @OtherFuncParam1 int,
     @OtherFuncParam2 int)
RETURNS int
AS
BEGIN
    DECLARE @OtherFuncValue int;
    SET @OtherFuncValue = OtherFunc(@OtherFuncParam1, @OtherFuncParam2);

    RETURN (@FuncParam1 * @FuncParam2) / @OtherFuncValue;
END

这个问题是,有几个函数需要很多参数(多达30多个)来执行计算以及所有其他所需函数的所需计算。 30+参数的可维护性是非常不可取的。

我想到的解决方案是创建标量函数,只使用params,任何连接和Table-Valued Functions处理返回函数所需的适当值。一个粗略的例子:

CREATE FUNCTION SomeCalculation(@SomeIdToJoin)
RETURNS int
AS
BEGIN
    SELECT * FROM SomeCalculationColumns(@SomeIdToJoin) AS NewParams;

    DECLARE @OtherFuncValue int;
    SET @OtherFuncValue = OtherFunc(NewParams.OtherFuncParam1, NewParams.OtherFuncParam2);

    RETURN (NewParams.FuncParam1 * NewParams.FuncParam2) / @OtherFuncValue;
END

我认为该解决方案可以清除所需的参数,但并不能完全解决可维护性问题。我也担心这个解决方案的性能。

我愿意接受任何改进此方法或任何其他方法的建议,以使这些计算更易于维护和理解。

0 个答案:

没有答案