为什么我的 SQL 函数是非确定性的,而它不应该是?
Why is my SQL function non-deterministic, when it shouldn't be?
根据 MS docs DATEADD
是一个确定性函数,因此我下面的函数也应该是确定性的:
CREATE FUNCTION [dbo].[Epoch2Date] (@i INT)
RETURNS DATETIME WITH SCHEMABINDING
BEGIN
RETURN DATEADD(SECOND,@i,'1970-01-01 00:00:00')
END
但是当我用 SELECT OBJECTPROPERTY(OBJECT_ID('[dbo].[Epoch2Date]'), 'IsDeterministic')
检查它时 returns 0
(非确定性)。
- 为什么它是不确定的?
- 如何使我的函数具有确定性?
有一个类似的,但它使用非确定性函数CAST
,这里不是这种情况。
DATEADD
是。但是,将 varchar
隐式转换为 datetime
是 而不是 。当您使用的格式对于 datetime
不明确时,情况尤其糟糕(尽管至少值是相同的)。
您需要使用样式显式转换值:
DATEADD(SECOND,@i,CONVERT(datetime,'19700101',112))
根据 MS docs DATEADD
是一个确定性函数,因此我下面的函数也应该是确定性的:
CREATE FUNCTION [dbo].[Epoch2Date] (@i INT)
RETURNS DATETIME WITH SCHEMABINDING
BEGIN
RETURN DATEADD(SECOND,@i,'1970-01-01 00:00:00')
END
但是当我用 SELECT OBJECTPROPERTY(OBJECT_ID('[dbo].[Epoch2Date]'), 'IsDeterministic')
检查它时 returns 0
(非确定性)。
- 为什么它是不确定的?
- 如何使我的函数具有确定性?
有一个类似的CAST
,这里不是这种情况。
DATEADD
是。但是,将 varchar
隐式转换为 datetime
是 而不是 。当您使用的格式对于 datetime
不明确时,情况尤其糟糕(尽管至少值是相同的)。
您需要使用样式显式转换值:
DATEADD(SECOND,@i,CONVERT(datetime,'19700101',112))