私は次の声明を持っています:
SELECT CASE WHEN (1 = 1) THEN 10 ELSE dbo.at_Test_Function(5) END AS Result
この場合、関数が実行されないことを確認したいだけですか?
質問する理由は、関数が特に遅いためです。基準が真の場合、関数の呼び出しを避けたい...
乾杯アンソニー
私は次の声明を持っています:
SELECT CASE WHEN (1 = 1) THEN 10 ELSE dbo.at_Test_Function(5) END AS Result
この場合、関数が実行されないことを確認したいだけですか?
質問する理由は、関数が特に遅いためです。基準が真の場合、関数の呼び出しを避けたい...
乾杯アンソニー
あなたの仮定は正しいです - それは実行されません。私はあなたの懸念を理解していますが、CASE コンストラクトはその点で「スマート」です。最初の有効な条件の後に条件を評価しません。それを証明する例を次に示します。この case ステートメントの両方のブランチを実行すると、「ゼロ除算」エラーが発生します。
SELECT CASE
WHEN 1=1 THEN 1
WHEN 2=2 THEN 1/0
END AS ProofOfConcept
これは理にかなっていますか?
この仮定をしないでください。それは間違っています。クエリ オプティマイザーは、評価の順序を自由に選択できます。また、言語としての SQL は演算子の短絡を提供しません。テストで関数が評価されないことがわかったとしても、本番環境では、サーバーが別の実行計画を選択し、最初に関数を評価し、次に残りの式を評価する条件に時々遭遇する可能性があります。典型的な例は、サーバーが関数の戻り値が決定論的であり、行データに依存していないことに気付いた場合です。この場合、サーバーは最初に関数を評価して値を取得し、その後、テーブルのスキャンを開始して WHERE 包含基準を評価します。事前に決定された関数値を使用します。
何らかのテストを行っていると仮定すると... at_Test_Functionを回避しようとしている場合は、コメントアウトして実行してください。
SELECT 10 AS Result
関数にaWaitFor Delay '00:00:05'
を入れます。ステートメントがすぐに返される場合、返されるまでに 5 秒かかる場合は実行されず、実行されたことになります。