0

UDFパラメータとして渡された他のフィールド値に基づいて「ステータス」を計算する関数があります。C#これをSQLサーバープロジェクトとして使用して作成しました。

実際の機能ではありませんが、より簡単な例としての私の問題:

MyUdf(int a,int b):

return a+b

でも私はしたい :

return a+b+c、ここでcは事前定義された値で、別のテーブルからパラメーターとして取得されるため、後で変更できます。

問題は 2 つあります。

1) の別のテーブルからこの値をロードする方法はUDF?

そして更に重要なことに...

2) 後で値をキャッシュして、パフォーマンスの問題になる可能性があるため、すべての行で値が取得されないようにする方法。

私は解決策を探しているわけではありませんが、続行する方法についてのヒントを探しています。

私の実際の機能:

[SqlFunction]
public static string CalcBDAlert(DateTime currentTime, string status, DateTime prevMilestoneAt, DateTime nextMilestoneAt)
{
    // quick process
    if (status == "Finished")
    {
        return "4,...";
    }
    else if (status == "Cancelled")
    {
        return "5,...";
    }

    #region Un-Allocated
    if (status == "Un-Alloc.")
    {
        var minPassedSinceMilestone = (currentTime - prevMilestoneAt).TotalMinutes; // milestone was start, creation of call.

        if (minPassedSinceMilestone < 15)
        {
            return "3,...";
        }
        else if (minPassedSinceMilestone < 30)
        {
            return "2,>15 Min";
        }
        else if (minPassedSinceMilestone < 35)
        {
            return "1,>30 Min!";
        }
        else
        {
            return "0,>35 Min!!";
        }
    }
    #endregion

    #region Allocated
    else if (status == "Alloc.")
    {
        var minPassedSinceMilestone = (currentTime - prevMilestoneAt).TotalMinutes; // milestone was allocation of engineer.
        var minRemTillNextMilestone = (nextMilestoneAt - prevMilestoneAt).TotalMinutes; // next milestone is ETA, predicted arrival time.
        var percentageTillNextMilestone = minPassedSinceMilestone / minRemTillNextMilestone;

        if (percentageTillNextMilestone < 0.90)
        {
            return "3,...";
        }
        else if (percentageTillNextMilestone < 0.95)
        {
            return "2,90-95%";
        }
        else if (percentageTillNextMilestone < 1)
        {
            return "1,>95%!";
        }
        else
        {
            return "0,>100%!!";
        }
    }
    #endregion

    #region Arrived
    else if (status == "Arrived")
    {
        var minPassedSinceMilestone = (currentTime - prevMilestoneAt).TotalMinutes; // milestone was arrival of engineer.
        var minRemTillNextMilestone = (nextMilestoneAt - prevMilestoneAt).TotalMinutes; // next milestone is completion of work.
        var percentageTillNextMilestone = minPassedSinceMilestone / minRemTillNextMilestone;

        if (percentageTillNextMilestone < 0.90)
        {
            return "3,...";
        }
        else if (percentageTillNextMilestone < 0.95)
        {
            return "2,90-95%";
        }
        else if (percentageTillNextMilestone < 1)
        {
            return "1,>95%!";
        }
        else
        {
            return "0,>100%!!";
        }
    }
    #endregion

    return "-1,Unknown";
}

パーセンテージ(.9、.95、1)と分(15、30、35)などをパラメータ化してキャッシュしたいと思います。

4

1 に答える 1

0

まあ、udf自体は次のようなものです:

CREATE FUNCTION myUdf 
(
    @a INT,
    @b INT
)
RETURNS INT
AS
BEGIN
    DECLARE @c INT
    SET @c = (SELECT TOP(1) id FROM my_table)
    RETURN @a + @b + @c
END
GO

キャッシングについてはどうでしょうか。まったく気にする必要はありません。rdbms が自動的に処理してくれます。SQLサーバーはいくつかの選択結果、実行計画などをメモリに保持するため、UDFが十分に頻繁に実行される場合-SQLサーバーはそれをキャッシュします

于 2013-03-06T11:35:11.427 に答える