Aufrufen einer Funktion aus innerhalb einer select-Anweisung - SQL
Habe ich die folgende Anweisung:
SELECT CASE WHEN (1 = 1) THEN 10 ELSE dbo.at_Test_Function(5) END AS Result
Ich will einfach nur, um zu bestätigen, dass in diesem Fall die Funktion nicht ausgeführt werden?
Mein Grund für die Frage ist, dass die Funktion ist besonders langsam und wenn die critiria wahr ist, ich möchte vermeiden, den Aufruf der Funktion...
Cheers
Anthony
Du musst angemeldet sein, um einen Kommentar abzugeben.
Machen Sie nicht diese Annahme, es ist FALSCH. Der Abfrageoptimierer ist völlig frei bei der Bewertung, um es ihm gefällt und SQL als Sprache NICHT bieten Betreiber Kurzschluss. Auch wenn Sie in der Prüfung, dass die Funktion nie ausgewertet, in der Produktion können Sie schlagen jedes jetzt und dann-Bedingungen, die bewirken, dass den server einen anderen Ausführungsplan und erste Bewertung der Funktion, dann der rest des Ausdrucks. Ein typisches Beispiel wäre, wenn der server bemerkt, dass die Funktion deterministisch ist und nicht je nach Zeile von Daten, in dem Fall würde es zunächst bewerten, die Funktion, den Wert, und nach, dass starten Sie das scanning den Tisch und bewerten die, WO die Einschlusskriterien mit der Funktion Wert vorher festgelegt.
Ihre assumpion ist korrekt - es wird nicht ausgeführt werden. Ich verstehe deine Sorge, aber das CASE-Konstrukt ist "smart", dass - er nicht bewerten, ob die Bedingungen nach dem ersten gültigen Zustand. Hier ist ein Beispiel, um es zu beweisen. Wenn die beiden Zweige des case-Anweisung wurde ausgeführt, würden Sie bekommen einen "teilen durch null" - Fehler:
Macht das Sinn?
Vorausgesetzt, Sie machen eine Art von Tests... Wenn Sie versuchen, zu vermeiden, die at_Test_Function, warum nicht einfach in einen Kommentar und tun
Setzen Sie ein
WaitFor Delay '00:00:05'
in der Funktion. Wenn die Anweisung gibt, sofort es hat nicht ausgeführt, wenn es dauert 5 Sekunden, um dann wieder es ausgeführt wurde.