Детерминированная функция для получения сегодняшней даты

Я пытаюсь создать индексированное представление, используя следующий код (чтобы я мог опубликовать его для репликации в виде таблицы):

CREATE VIEW lc.vw_dates
WITH SCHEMABINDING
AS

SELECT DATEADD(day, DATEDIFF(day, 0, GETDATE()), number) AS SettingDate
FROM lc.numbers
WHERE number<8

GO

CREATE UNIQUE CLUSTERED INDEX
idx_LCDates ON lc.vw_dates(SettingDate)

lc.numbers — это просто таблица с 1 столбцом (number), который увеличивается на строку 1-100.

Тем не менее, я продолжаю получать сообщение об ошибке:

Столбец «SettingDate» в представлении «lc.vw_dates» нельзя использовать в индексе или статистике или в качестве ключа раздела, поскольку он недетерминирован.

Я понимаю, что GETDATE() недетерминирован. Но есть ли способ заставить это работать?

Я использую MS SQL 2012.

Изменить: надежда заключалась в том, чтобы иметь возможность преобразовать GetDate(), чтобы сделать его детерминированным (похоже, что это должно быть при удалении времени). Если никто не знает, как это сделать, я закрою этот вопрос и отмечу предложение создать таблицу календаря как правильное.


person bbailes    schedule 24.11.2015    source источник
comment
Можете ли вы создать таблицу календаря и создать представление поверх нее?   -  person shree.pat18    schedule 24.11.2015
comment
Я могу, но это чрезвычайно упрощенная версия того, что я пытаюсь сделать. Я, вероятно, могу найти другой способ. Просто интересно, есть ли что-то известное, что я могу сделать, чтобы обойти это.   -  person bbailes    schedule 24.11.2015


Ответы (1)


Определение детерминированной функции (из MSDN):

Детерминированные функции всегда возвращают один и тот же результат каждый раз, когда они вызываются с определенным набором входных значений и при одном и том же состоянии базы данных. Недетерминированные функции могут возвращать разные результаты каждый раз, когда они вызываются с определенным набором входных значений, даже если состояние базы данных, к которому они обращаются, остается прежним.

Обратите внимание, что это определение не включает какой-либо конкретный промежуток времени, в течение которого результат должен оставаться неизменным. Это должен быть один и тот же результат всегда для данного ввода.

Любая функция, которую вы можете представить, которая всегда возвращает дату в момент вызова функции, по определению будет возвращать другой результат, если вы запустите ее в один день, а затем снова на следующий день (независимо от состояния базы данных).

Следовательно, функция, возвращающая текущую дату, не может быть детерминированной.

Единственная возможная интерпретация этого вопроса, которая могла бы включить детерминированную функцию, - это если бы вы были счастливы передать в качестве входных данных функции некоторую информацию о том, какой сегодня день.

Что-то типа:

select fn_myDeterministicGetDate('2015-11-25')

Но я думаю, что это лишило бы смысла, насколько вы обеспокоены.

person Stuart J Cuthbertson    schedule 25.11.2015