[英]Calling a function from within a select statement - SQL
我有以下聲明:
SELECT CASE WHEN (1 = 1) THEN 10 ELSE dbo.at_Test_Function(5) END AS Result
我只想確認在這種情況下將不會執行該功能?
我問的原因是該函數特別慢,如果critiria是正確的,我想避免調用該函數...
干杯安東尼
您的假設是正確的-不會執行。 我了解您的關注,但是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
在函數中放置WaitFor Delay '00:00:05'
。 如果該語句立即返回,則需要5秒鍾才能返回,則該語句沒有執行,則該語句已執行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.