0

一度に複数の値を返すことができるように、テーブル値関数を宣言しています。値は、DECLARE および Maths and Date 関数を使用して計算されます。

この機能は、「記録された日付」と、サポート システムの問題の優先度のみを受け取るように構成されています。正直なところ、次のように選択できると思いました。

SELECT SupportCall.*, dbo.GetSLAStatus(SupportCall.createDate, SupportCall.priority).* FROM SupportCall

私は実際に終わった:

SELECT SupportCall.*,
    SLADays = (select SLADays from dbo.GetSLAStatus(SupportCall.createDate, SupportCall.priority)),
    SLARecieved = (select SLAReceived from dbo.GetSLAStatus(SupportCall.createDate, SupportCall.priority)),
    SLATarget = (select SLATarget from dbo.GetSLAStatus(SupportCall.createDate, SupportCall.priority)),
    SLAHoursRemaining = (select SLAHoursRemaining from dbo.GetSLAStatus(SupportCall.createDate, SupportCall.priority))
From SupportCall

適用の可能性のある結合が表示されません (とにかく完全には理解できません)。

同じパラメーターを使用した関数呼び出しが 1 回実行されるかどうかを知っている人はいますか? クエリの実行時に多くのサブクエリと関数呼び出しが発生しない場合は、気にしません。簡潔ではないにしても、コードは実際には非常に整然としています。

大量のオーバーヘッドがある場合、この種のテーブル関数からすべての列を選択する方法を知っている人はいますか (つまり、キーがなく、同じ入力データに対するいくつかの計算のみ)。

ありがとう。

マーク

4

2 に答える 2

2

そうしないでください!インライン クエリは、JOINS または APPLY よりも決して高速ではありません。クエリを書き直して、IO を確認します。次のように書き換えることができます。

SELECT SupportCall.*,
    SLADays = gs.SLADays,
    SLAReceived = gs.SLAReceived,
    ...
From SupportCall sc
CROSS APPLY dbo.GetSLAStatus(SupportCall.createDate, SupportCall.priority) gs
于 2015-02-17T13:07:00.610 に答える
0

これを行うことはできません:

SELECT C.*,
    F.SLADays,
    F.SLAReceived,
    F.SLATarget,
    F.SLAHoursRemaining
From 
    SupportCall C
    cross apply dbo.GetSLAStatus(C.createDate, C.priority) F

関数がインライン関数であることを願っています (たとえば、戻りテーブル return (...) を開始する単一のステートメントがあり、結果テーブルが定義されていません)

于 2015-02-17T13:08:07.823 に答える