SQL Server ISDATE в индексированном представлении - PullRequest
4 голосов
/ 25 января 2012

У меня есть индексированное представление, где мне в основном нужно это сделать

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 ]

4 голосов
/ 25 января 2012

Должно быть, если вообще:

SELECT ... 
    CASE 
         WHEN ISDATE(ColumnName) = 1 THEN CONVERT(datetime, ColumnName, 103) 
         ELSE NULL 
    END
....

но вы не используете ISDATE WITH CONVERT, поскольку нет выражения типа

ISDATE(CONVERT(varchar,ColumnName,112)) 

без вложенного преобразования возвращаемое значение зависит от таких вещей, как языковые настройки, поэтому это недетерминированное поведение. Без «внешних» знаний невозможно предсказать результат, который человек получает, основываясь только на вводе.

0 голосов
/ 25 января 2012

Ссылка Каковы требования для индексированных представлений? Существует несколько требований, которые необходимо учитывать при использовании индексированных представлений.

    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
...