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

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

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.

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

1 ответ

Решение

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

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

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

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

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

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

Что-то вроде:

select fn_myDeterministicGetDate('2015-11-25')

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

Другие вопросы по тегам