星期五, 5月 10, 2024

[SQL] 避免在 Select 中使用 Scalar Function (續)

[SQL] 避免在 Select 中使用 Scalar Function 內有提到 Scalar Function 副作用,該筆記內是用 getTotalPrice() 來驗證,該 function 有實際讀取 table 行為,在網路上看見問題,function 內不涉及 table 讀取,單純就是參數輸入後解析再輸出而已,該篇筆記驗證看看該情況,Scalar Funcation 是否也會反覆處理

建立 Scalar Function

把 [日期 datetime] 轉為 [民國年 char(7)],不涉及 table 讀取
CREATE FUNCTION udfConvertToTWDate
(
	@ADDate datetime
)
RETURNS char(7)
AS
BEGIN
	DECLARE @TWYY char(3) = RIGHT(REPLICATE('0' , 3) + CAST(YEAR(@ADDate) - 1911 as varchar(3)) , 3)
	DECLARE @MM char(2) = RIGHT(REPLICATE('0' , 2) + CAST(MONTH(@ADDate) as varchar(2)) , 2)
	DECLARE @DD char(2) = RIGHT(REPLICATE('0' , 2) + CAST(DAY(@ADDate) as varchar(2)) , 2)
	RETURN @TWYY + @MM + @DD
END
GO

實際執行


ALTER DATABASE [AdventureWorks2022] SET COMPATIBILITY_LEVEL = 140;

SELECT
	BusinessEntityID , 
	LastName ,
	MiddleName ,
	FirstName ,
	ModifiedDate ,
	[dbo].udfConvertToTWDate(ModifiedDate) AS TWDate
FROM Person.Person
WHERE ModifiedDate BETWEEN '2008-01-01' AND '2008-12-31'

Profile 觀察

在 Profile 內還是可以看見反覆執行情況,看起來這是 Scalar Function 宿命啦,另外開 Profile 時要選擇 Tuning 範本來收集,一開始使用預設 standard 範本觀察不到,還想說讀不讀取 table 竟然會有差別,完全就是誤會


沒有留言:

張貼留言