【问题标题】:Convert to a deterministic function with SQL Server使用 SQL Server 转换为确定性函数
【发布时间】:2017-03-09 23:58:39
【问题描述】:

我正在尝试使用 SQL Server 创建一个确定性函数,以便我可以为调用此函数的视图创建索引。此函数采用列名并将月末作为日期时间返回。例如,20170120170131

你能帮我把它转换成确定性函数吗?

CREATE FUNCTION dbo.ufnGetFiscalPeriodEndDate (@FiscalPeriod VARCHAR(10))

RETURNS DATE 
WITH SCHEMABINDING
AS BEGIN
    RETURN EOMONTH(CAST(LEFT(@FiscalPeriod, 4) + RIGHT(@FiscalPeriod, 2) + '01' AS DATE))
END

此 OBJECTPROPERTY 查询返回 0...

SELECT OBJECTPROPERTY(OBJECT_ID('dbo.ufnGetFiscalPeriodEndDate'), 'IsDeterministic')

【问题讨论】:

    标签: sql-server function deterministic non-deterministic


    【解决方案1】:

    如果你有EOMONTH,你就有DATEFROMPARTS。我认为CAST 是不确定的,因为它可能取决于语言设置。但这似乎对我有用:

    ALTER FUNCTION dbo.ufnGetFiscalPeriodEndDate (@FiscalPeriod VARCHAR(10))
    
    RETURNS DATE 
    WITH SCHEMABINDING
    AS BEGIN
        RETURN EOMONTH(DATEFROMPARTS(LEFT(@FiscalPeriod, 4), RIGHT(@FiscalPeriod, 2) , 1));
    END
    go
    

    【讨论】:

    • 太棒了!谢谢!
    猜你喜欢
    • 2019-06-10
    • 1970-01-01
    • 1970-01-01
    • 2021-06-14
    • 2011-04-01
    相关资源
    最近更新 更多