2012-02-13 3 views
0

計算列内で使用する関数DiffMinutiがあります。変数として宣言して、1回だけ呼び出してコードを最適化したいと思います。あなたのお手伝いをありがとう:SQL Server:関数を計算列内で変数として宣言する方法

ALTER TABLE Ticket ADD MinutiAllaScadenza AS (" + 
CASE 
WHEN StatoTicketID > 3 AND dbo.DiffMinuti(DataArrivo, DataObiettivo) <0 THEN 10000000 
ELSE dbo.DiffMinuti(DataArrivo, DataObiettivo) 
END) 

ありがとう! よろしく

答えて

1

あなたはDiffMinuti結果を格納するための新しいフィールドを追加し、最新の値を維持するためにINSERTやUPDATEトリガーを持って、そしてちょうどMinutiAllaScadenza計算フィールドに新しいフィールドを参照(代わりの関数を呼び出すことができ毎回)。

このような何か:

ALTER TABLE Ticket ADD DiffMinuti INT NULL 
GO 
CREATE TRIGGER trg_Ticket_DiffMinuti ON Ticket 
AFTER INSERT, UPDATE 
AS 
BEGIN 

    SET NOCOUNT ON; 

    IF UPDATE(DataArrivo) OR UPDATE(DataObiettivo) 
    BEGIN 

     UPDATE 
      b 
     SET 
      DiffMinuti = dbo.DiffMinuti(DataArrivo, DataObiettivo) 
     FROM 
      INSERTED a INNER JOIN 
      Ticket b ON a.TicketID = b.TicketID; 

    END; 

END; 
GO 
ALTER TABLE Ticket ADD MinutiAllaScadenza AS CASE WHEN StatoTicketID > 3 AND DiffMinuti <0 THEN 10000000 ELSE DiffMinuti END 
GO 
+0

@domanagerを表現をラップする必要があると思います。ありがとうございました! 私はそれがとても複雑だとは思わなかった...「MinutiAllaScadenza」計算フィールドを計算する最も効率的な方法は何だと思いますか? 「Diffminuti」関数をダブルコールして、あなたが記述したものか、現在私が使っているものか? ありがとう、あなたは非常に徹底的で専門的です! – Larry

+0

@Larry大量の挿入/更新が多数あり、メソッドのテーブルからの読み込みがほとんどない方が良いが、データがかなり静的で照会されている場合は、テーブルの使用方法によります多くの場合、返される各行の関数を呼び出す必要がなくなり、より効率的になります。 – domager

+0

@domager:悪いケースでDiffMinutiのテーブルへの2次書き込みの最上部に残っている計算カラムのRBAR処理があります... – gbn

2

あなたは、計算列の式で直接これを行うことはできません:あなたは別の関数で

+0

THX @gbn ...上記のdomanagerの回答を参照してください。今私はそれを行う最も効率的な方法に疑問を抱いています... – Larry

+0

@Larry:私は個人的に計算された列を保つでしょう。私はちょうどそれも、余分な機能を気にしないようにそれを保つだろう。トリガー*と*計算された列をプリドンガーの答えとして使用することは、イディオイですIMO – gbn

+0

THX @gbn。少なくとも、私の場合は、トリガーを使って新しい計算フィールドを作成するのは非常に難しいようです...実際のパフォーマンスの利点がない限り...他の人が考えて決めたことを見てみましょう...もう一度ありがとう! – Larry

関連する問題