2009-05-13 15 views
0

私は次の文がありますは、select文の中から関数を呼び出す - SQL

SELECT CASE WHEN (1 = 1) THEN 10 ELSE dbo.at_Test_Function(5) END AS Result 

を私はこのケースでは機能が文句を言わないで実行することを確認したいですか?

尋ねるための私の理由は、あなたがテストのいくつかの種類を行っていると仮定すると...機能は特に遅く、critiriaがtrueの場合、私は関数を呼び出す避けたいという

乾杯 アンソニー

答えて

3

この仮定をしないでください。これはです。誤ってです。クエリオプティマイザは、評価の順序を自由に選択でき、言語としてのSQLはオペレータの短絡を提供しません。関数が評価されないことがテストで分かったとしても、本番では、サーバーが異なる実行計画を選択して最初に関数を評価し、残りの式を評価するような条件が発生する可能性があります。典型的な例は、関数の戻り値が決定的であり、行データに依存しないことに気づいたときです。その場合は、最初に値を取得する関数を評価し、の後にがテーブルをスキャンし、WHERE事前に決定された関数値を使用して包含基準を計算する。

+0

Itzik Ben-Ganによるこの記事を見ると、この誤った推定がゼロ誤差でどのように分裂する可能性があるかを示している。http://www.sqlmag.com/Articles/ArticleID/9148/pg /2/2.html –

+0

BTW、可能であれば、チェックを行い、元の関数を呼び出すラッパー関数を作成してみてください。 IF/THEN/ELSEは、条件に合致しないブランチを実行しないことが保証されています。 –

0

です...あなたはat_Test_Functionを避けるためにしようとしているなら、なぜそれをコメントアウトし、

SELECT 10 AS Result 
+0

これは実際の生活の中での単純化されたケースで、いつの基準がより複雑になるかです。 –

0

が関数でWaitFor Delay '00:00:05'を入れません。ステートメントがすぐに返された場合、返されるまでに5秒かかると実行されず、実行されました。

4

あなたの仮定は正しい - それは実行されません。私はあなたの懸念を理解していますが、CASE構成はそのように「スマート」です。最初の有効な条件の後には条件を評価しません。それを証明する例がここにあります。この場合、文の両方のブランチを実行した場合は、エラー「ゼロ除算」になるだろう:

SELECT CASE 
       WHEN 1=1 THEN 1 
       WHEN 2=2 THEN 1/0 
      END AS ProofOfConcept 

これは理にかなっていますか?

+0

クールだとは思わなかった、歓声 –

関連する問題