SQL Server ISDATE в индексированном представлении
У меня есть индексированное представление, где мне нужно сделать это
SELECT ...
CASE
WHEN ISDATE(ColumnName) = 1 THEN CONVERT(datetime, ColumnName, 103)
ELSE NULL
END AS ViewColumn
....
Попытка создать индекс дает:
Невозможно создать индекс для представления "....". Функция isdate дает недетерминированные результаты. Используйте детерминированную системную функцию или измените пользовательскую функцию для возврата детерминированных результатов.
MSDN говорит
ISDATE является детерминированным, только если вы используете его с функцией CONVERT,
если задан параметр стиля CONVERT, а стиль не равен 0, 100, 9 или 109.
здесь http://msdn.microsoft.com/en-us/library/ms187347.aspx.
Но я вообще не знаю, что это значит. Насколько я могу судить, я использую его с функцией CONVERT....
Есть ли способ обойти это?
2 ответа
Так и должно быть:
SELECT ...
CASE
WHEN ISDATE(ColumnName) = 1 THEN CONVERT(datetime, ColumnName, 103)
ELSE NULL
END
....
но вы не используете ISDATE WITH CONVERT, так как нет выражения вроде
ISDATE(CONVERT(varchar,ColumnName,112))
без вложенного преобразования возвращаемое значение зависит от таких вещей, как языковые настройки, поэтому это недетерминированное поведение. Без "внешних" знаний невозможно предсказать результат, который человек получает, основываясь только на исходных данных.
Ссылка Каковы требования для индексированных представлений? Существует несколько требований, которые необходимо учитывать при использовании индексированных представлений.
1. View definition must always return the same results from the same underlying data.
2. Views cannot use non-deterministic functions.
3. The first index on a View must be a clustered, UNIQUE index.
4. If you use Group By, you must include the new COUNT_BIG(*) in the select list.
5. View definition cannot contain the following
(A) TOP
(B) Text, ntext or image columns
(C)DISTINCT
(d)MIN, MAX, COUNT, STDEV, VARIANCE, AVG
(E)SUM on a nullable expression
(F)A derived table
(G)Rowset function
(H)Another view
(I)UNION
(J)Subqueries, outer joins, self joins
(K)Full-text predicates like CONTAIN or FREETEXT
(L)COMPUTE or COMPUTE BY
(M)Cannot include order by in view definition