使用创建的函数比声明变量有什么好处吗?

is there any benefit to using a created FUNCTION over declaring a variable?

我使用下面的 return 上周财政周数

SELECT (
    SELECT
        CA.FISCALWEEK
    FROM 
        EUUKSQL01.DASHBOARD.DBO.CALENDAR CA
    WHERE 
        CONVERT(DATE,GETDATE()) = CONVERT(DATE,CA.FULLDATE)   ) - 1

如果我在查询中经常使用它,我声明并将其设置为@LW 等

我也将它创建为 FUNCTION,

使用一种方法比使用另一种方法有什么好处吗?

UDF(用户定义函数)会对您的查询速度产生负面影响。如果您没有将 MAXDOP(最大并行度)设置为 1,则使用 UDF 的查询将阻止并行性。

您可以在您的解释计划中看到它并尝试哪种解决方案更快。

另一方面,代码的重用和更容易的调试在 UDF 中很好。

如果你想同时拥有两者,你可以编写自己的 CLR,其中包含 UDF 的逻辑。

我做的测试:

CREATE FUNCTION [dbo].[GetLW]()
RETURNS datetime 
AS 
BEGIN
RETURN CONVERT(DATE,GETDATE())
END
GO

SELECT * 
FROM [TGR].[dbo].[LargeTable]
WHERE BookingDate = [dbo].[GetLW]()
GO

DECLARE @LW datetime = CONVERT(DATE,GETDATE())

SELECT * 
FROM [TGR].[dbo].[LargeTable]
WHERE BookingDate = @LW
GO

解释计划:

因此,如果您处于 DWH/BI 环境中,也许变量是更好的解决方案。

问候 Tgr

使用 GETDATE() 会产生不确定的结果。我建议在变量中使用结果。除了通过独特的调用获得性能之外,您还将避免不一致的结果。想象一下,如果您在两个纳税周之间的午夜进行一系列 GETDATE 调用,其中一些在之前,一些在之后。