我創建了這個函式:
CREATE FUNCTION ml.fn_Temp()
RETURNS @ResultTable TABLE (Code int)
AS
BEGIN
DECLARE @Id int = (select 1 / 0)
RETURN
END
我運行這個查詢:
DECLARE @AccFieldKindName int = 9
SELECT
CASE
WHEN @AccFieldKindName = 7
THEN (SELECT Code FROM ml.fn_Temp())
WHEN @AccFieldKindName = 9
THEN 67777
END
我收到一個錯誤:
遇到除以零錯誤
我認為運行條件不正確的代碼是不正確的。
為什么 SQL 會運行所有查詢?實際上ml.fn_Temp是一個沉重的查詢。在每次運行中,SQL 都會運行此函式,這會導致性能問題。
我可以更改此行為,僅case when在條件為真的情況下運行部分內容嗎?我不想將此查詢更改為If ... else。
uj5u.com熱心網友回復:
這是非常值得期待的。
非相關多陳述句 TVF始終在參考它的查詢之前執行并填充結果的表變數。
有一個序列運算子首先運行該計劃,然后運行計劃的其余部分。所以在執行CASE偶數開始之前遇到錯誤

編輯:有一個例外到總是實際OPTION (RECOMPILE)允許CASE表達在編譯時間而不是運行時間和到TVF參考被完全從計劃中洗掉來評價。
您的演示代碼不現實,但也許對您有用?否則,也許您可??以在實際場景中使用行內表值函式。
或者在執行查詢之前使用本地表變數/臨時表在需要時有條件地呼叫函式
DECLARE @AccFieldKindName INT = 9
DECLARE @fn_Temp TABLE
(
Code INT
);
IF @AccFieldKindName = 7
BEGIN
INSERT @fn_Temp
(Code)
SELECT Code
FROM dbo.fn_Temp()
END
SELECT CASE
WHEN @AccFieldKindName = 7 THEN (SELECT MIN(Code) FROM @fn_Temp)
WHEN @AccFieldKindName = 9 THEN 67777
END
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/404968.html
標籤:
上一篇:SQL查詢在加入表后回傳重復值
