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)などをパラメータ化してキャッシュしたいと思います。