Преобразование в детерминированную функцию с помощью SQL Server

Я пытаюсь создать детерминированную функцию с помощью SQL Server, чтобы я мог создать индекс для представления, которое вызывает эту функцию. Эта функция принимает имя столбца и возвращает конец месяца как datetime. Например, от 201701 до 20170131.

Не могли бы вы помочь мне преобразовать это в детерминированную функцию?

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')

person E.K.    schedule 09.03.2017    source источник


Ответы (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
person Ben Thul    schedule 10.03.2017
comment
Фантастика! Спасибо! - person E.K.; 10.03.2017