2012-04-29 3 views
3

内部の関数を使用するストアドプロシージャがあり、この関数では2つのパラメータが必要です。 私の問題は、今、私は私が代わりに私は機能にそれを取得するたびに呼び出しています方法の機能を呼び出すためにそれを使用することができ、一時テーブルを作成されて何をしたいのかストアドプロシージャ内で複数回ではなく集計関数を1回使用する

CASE 
WHEN (DATEDIFF(MINUTE,dbo.FunctionName(DatetimeField, DatetimeID), dbo.FunctionName(DatetimeField, DatetimeID))/60.0) > 8 THEN 
     (DATEDIFF(MINUTE,dbo.FunctionName(DatetimeField, DatetimeID), dbo.FunctionName(DatetimeField, DatetimeID))/60.0) 
Else 0 
END 
Else 
0 
END) 
Else 
(DATEDIFF(MINUTE,dbo.FunctionName(DatetimeField, DatetimeID), dbo.FunctionName(DatetimeField, DatetimeID))/60.0)-T.lunch 
END 
    as 'Total' 

下記参照パフォーマンスの問題に関連しています通過する数十万のレコードを持つこれらの行に 何か助けていただければ幸いです。

+0

本当に助けが必要ですか?どのように[テーブルを作成する](http://msdn.microsoft.com/en-us/library/ms174979.aspx)?または[データの挿入](http://msdn.microsoft.com/en-us/library/ms174335.aspx)の方法を教えてください。または、クエリでそのテーブルを使用する方法は?あなたは何を試しましたか? –

+0

おそらくパフォーマンス上の問題であるテーブルから関数名を選択している場合、 'FunctionName'関数は何をしていますか? – Magnus

+3

ユーザー定義のスカラー関数は、本来、SQL Serverでは(2012年以前は)非効率的です。あなたのdbo.FunctionName()関数をポストすると、より効率的なテーブル値関数として書き直す方法を示すことができます。 – RBarryYoung

答えて

1

あなたはこのようなクエリの内部表現を再利用することができます

select (case when NewValue > 8 then NewValue else 0 end) xyz 
from T 
cross apply (
select NewValue = dbo.FunctionName(DatetimeField, DatetimeID) 
) x 

クロス適用する新しい列を導入し、その価値を再利用するために使用することができ、この特定の方法で使用します。この手法は、同じクエリで共通の式を再利用するのに適しています。

通常のバッチレベルの変数は次のように宣言することができます:あなたの関数を仮定し

DECLARE @NewValue int = dbo.FunctionName(DatetimeField, DatetimeID); 
+0

そのメソッドは新しい列のみを作成できます。 AFAIK、新しい変数を作成することはできません。 – RBarryYoung

+0

多分私はあなたを誤解しました。このような変数を宣言することができます:DECLARE @NewValue int = dbo.FunctionName(DatetimeField、DatetimeID); – usr

+0

私は変数を宣言する方法を知っていますが、CROSS APPLYで変数を宣言することはできません。 – RBarryYoung

0

は決定論的(または少なくともかかわらず、クロック時間の同じ値を返します)で、あなたは次のように一時テーブルを設定することができます。

select DatetimeField, DatetimeID, FunctionName(DatetimeField, DatetimeID) as val 
into #tmp 
from (select distinct DatetimeField, DatetimeID 
     from table 
    ) t 

次に、これを使用するためにストアドプロシージャを書き直すことができます。

しかし、クエリが書き込まれると、決定論的関数は、2つの引数が同じであるため、単純に0を返します。

最後に、パフォーマンスの問題が呼び出されている関数に関連しているようです。コードを投稿することをお勧めします。

関連する問題