如果我有一个功能
ALTER FUNCTION [dbo].[GetCycleDate]
(
)
RETURNS DATE
AS
BEGIN
DECLARE @CYC_DT DATE
SELECT
@CYC_DT = CYC_DT
FROM
CYC_DT
WHERE
CURR_CYC_IND = 'C'
RETURN @CYC_DT
END
Run Code Online (Sandbox Code Playgroud)
对于一个非常大的表,这两个SQL会执行几乎相同的操作吗?
SELECT
*
FROM
[dbo].Table S
INNER JOIN dbo.CYC_DT D ON
S.GL_DT = D.CYC_DT AND
D.CURR_CYC_IND = 'C'
SELECT
*
FROM
[dbo].Table S
WHERE
S.GL_DT = dbo.GetCycleDate()
Run Code Online (Sandbox Code Playgroud)
我知道避免函数更安全,但出于测试目的,我希望能够修复函数以返回硬编码结果,而不会影响其他依赖于在Cycle周期中设置的日期的人所做的测试表.我希望能够在不影响其他任何人的情况下切换到不同的日期.
一般来说,这样做是一个坏主意,因为当涉及标量 UDF 时,优化器可以为您做的事情更加有限:
http://www.sql-server-performance.com/2005/sql-server-udfs/
由于您的标量 UDF 未参数化,并且您的示例查询很简单,因此您可能会侥幸逃脱,但您必须进行测试才能确定。