我試圖避免在我的項目中使用標量值函數,因此我決定嘗試使用CTE將其中的一個轉換爲表值函數。在表值函數中使用CTE的問題
我知道標量值函數的性能很差,因爲它必須針對每一行執行,並且SQL服務器無法以任何方式對其進行優化(即,它充當黑匣子)。
這是我在將其轉換爲表值函數的第一次嘗試......
CREATE FUNCTION [dbo].[fn_get_job_average] (@jobnumber VARCHAR(50))
RETURNS TABLE AS RETURN
(
WITH JobAverage AS
(
SELECT job.Jobnumber, CAST(AVG(CAST(jobMark.Mark AS DECIMAL(18,1))) AS DECIMAL(18,1)) AS Average
FROM job
INNER JOIN jobMark
ON job.Guid = jobMark.Guid
WHERE job.Jobnumber = @jobnumber
GROUP BY job.Jobnumber
)
SELECT Jobnumber,
CASE
WHEN EXISTS(SELECT * FROM JobAverage) THEN Average
ELSE 0.0 -- This never executes???, i.e. for job records that don't have a mark nothing is returned
END AS Average
FROM JobAverage
)
我要輸出與工作數量和平均得分的表。
對於確實有標記的工作,它似乎沒問題。也就是說,平均值與jobnumer一起返回。
對於沒有標記的工作,它似乎出錯了。聲明的ELSE部分不執行。也就是說,我沒有得到0.0作爲工作平均值返回。沒有記錄被返回。我錯過了什麼嗎?
對不起,我不是一個有經驗的SQL開發人員,所以我可能在上面的代碼中有一些明顯的錯誤。然而,我很困惑它爲什麼不起作用。
在此先感謝。
謝謝。非常感謝。我感覺很傻。我很欣賞所有的評論。 – bobbo
我想這可能會在CTE下工作。 (選擇* FROM JobAverage) ELSE 0.0 END AS平均值 – bobbo