【问题标题】:Why is my SQL function non-deterministic, when it shouldn't be?为什么我的 SQL 函数不应该是不确定的?
【发布时间】:2021-02-21 21:49:55
【问题描述】:

根据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') 检查它时,它会返回0(非确定性)。

  1. 为什么它是不确定的?
  2. 如何使我的函数具有确定性?

有一个类似的question,但它使用非确定性函数CAST,这里不是这种情况。

【问题讨论】:

    标签: sql-server function deterministic


    【解决方案1】:

    DATEADD。然而,将varchar 隐式转换为datetime不是。当您使用的 datetime 格式不明确时,情况尤其糟糕(尽管至少值相同)。

    您需要使用样式显式转换值:

    DATEADD(SECOND,@i,CONVERT(datetime,'19700101',112))
    

    【讨论】:

    • 谢谢!这样就解决了问题。最好在 MS 文档页面上发表评论。
    • 它是 @endo64 ,在我在您链接的问题中引用的文档中。隐式转换/转换仍然是转换/转换。在您的尝试中,您有一个字符串值('1970-01-01 00:00:00'),您在没有样式的情况下隐式转换/转换为datetime;这是明确定义为非确定性的。
    • 我明白,我的意思是,很高兴注意到DATEADD 进行了隐式转换,导致不确定性。
    • 如果您觉得它不准确,@endo64,然后在文档上提出拉取请求;虽然我个人认为它确实涵盖了它(隐含的:))。
    猜你喜欢
    • 1970-01-01
    • 2018-07-06
    • 1970-01-01
    • 1970-01-01
    • 2011-06-01
    • 2019-09-18
    • 2019-08-01
    • 1970-01-01
    • 2020-09-12
    相关资源
    最近更新 更多