使用 SQL Server 转换为确定性函数

Posted

技术标签:

【中文标题】使用 SQL Server 转换为确定性函数【英文标题】:Convert to a deterministic function with 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')

【问题讨论】:

【参考方案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

【讨论】:

太棒了!谢谢!

以上是关于使用 SQL Server 转换为确定性函数的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server聚合函数

将 PL-SQL 转换为 SQL Server

sql server中啥是聚合函数

将 MS Access 报告转换为 SQL Server 报告

sql server中的怎么把数值型转换为字符串

SQL server --时间日期函数类型转换