标量函数是不确定的



我想保留这个字段,但不明白为什么它是不确定的。

CREATE FUNCTION GetServiceMinutes
(
-- Add the parameters for the function here
@StartDate datetime,
@EndDate datetime
)
RETURNS int WITH SCHEMABINDING
AS
BEGIN
DECLARE @Result int
SET @StartDate = CASE WHEN DATEPART(HOUR, @StartDate) < 8 THEN DATEADD(DAY, DATEDIFF(DAY, 0, @StartDate), '08:00:00')  ELSE @StartDate END
SET @EndDate = CASE WHEN DATEPART(HOUR, @EndDate) >= 17 THEN DATEADD(DAY, DATEDIFF(DAY, 0, @EndDate), '17:00:00') ELSE @EndDate END

SET @Result = 
CASE WHEN DATEPART(DAY, @StartDate) != DATEPART(DAY, @EndDate) THEN 1000
WHEN DATEPART(HOUR, @EndDate) < 8 THEN 0
WHEN DATEPART(HOUR, @StartDate) >= 17 THEN 0
ELSE DATEDIFF(MINUTE, @StartDate, @EndDate)
END

RETURN @Result
END
GO

这返回0

SELECT OBJECTPROPERTY(OBJECT_ID('[dbo].GetServiceMinutes'), 'IsDeterministic')

使用SQL Server 2017

正如我所暗示的,问题是使用(日期和(时间值的隐式转换。根据文件:

以下函数并不总是具有确定性的,但当以确定性的方式指定时,可以在索引视图或计算列的索引中使用。

函数 注释
所有聚合函数 所有聚合函数都是确定性的,除非它们是用OVER和ORDER BY子句指定的。有关这些函数的列表,请参阅聚合函数(Transact-SQL(
CAST 确定性,除非与datetime、smalldatetime或sql_variant一起使用
CONVERT 确定性,除非存在以下条件之一:
源类型为sql_variant
目标类型为sql_variant,其源类型为不确定性
源或目标类型为datetime或smalldatetime,另一个源或目标的类型为字符串,并且指定了不确定的样式。为了具有确定性,样式参数必须是常量。此外,除了样式20和21之外,小于或等于100的样式是不确定的。大于100的样式具有确定性,样式106、107、109和113除外。

最新更新