Детерминированная функция для получения сегодняшней даты
Я пытаюсь создать индексированное представление, используя следующий код (чтобы я мог опубликовать его для репликации в виде таблицы):
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')
Но я думаю, что это побудило бы вас к этому.