4

我有一个索引视图,我基本上需要这样做

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,ISDATE 才具有确定性。

这里http://msdn.microsoft.com/en-us/library/ms187347.aspx

但我根本不知道那是什么意思。据我所知,我将它与 CONVERT 功能一起使用....

有什么办法可以解决这个问题?

4

2 回答 2

4

如果有的话,应该是:

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

但是,您没有使用 ISDATE WITH CONVERT,因为没有类似的表达式

ISDATE(CONVERT(varchar,ColumnName,112)) 

如果没有嵌套转换,则返回值取决于语言设置等内容,因此它是不确定的行为。如果没有“外部”知识,就无法仅根据输入来预测结果。

于 2012-01-25T18:00:58.670 回答
0

参考 索引视图有哪些要求?使用索引视图时,您必须考虑几个要求。

    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
于 2012-01-25T18:53:03.537 回答