使用 SQL 服务器转换为确定性函数

Convert to a deterministic function with SQL Server

我正在尝试使用 SQL 服务器创建一个确定性函数,以便我可以为调用此函数的视图创建索引。此函数采用列名和 returns 月末作为日期时间。例如,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 查询 returns 0...

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

如果你有 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