【问题标题】:SQL Server ISDATE In Indexed View索引视图中的 SQL Server ISDATE
【发布时间】:2012-02-18 22:08:43
【问题描述】:

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

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 函数一起使用....

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

【问题讨论】:

    标签: sql-server sql-server-2005 indexed-view


    【解决方案1】:

    如果有的话,应该是:

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

    但是,您没有使用 ISDATE WITH CONVERT,因为没有像

    这样的表达式
    ISDATE(CONVERT(varchar,ColumnName,112)) 
    

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

    【讨论】:

    • 所以不可能将 ISDATE 与索引视图一起使用?对此我能做些什么吗?
    • 您可以构建自己的确定性标量函数并使用它,如果它值得您费心的话。你真的需要对视图进行索引吗?
    【解决方案2】:

    Reference 索引视图的要求是什么? 使用索引视图时,您必须考虑几个要求。

        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
    

    【讨论】:

    • 视图上的索引在哪里?您的视图未编入索引,可以正常工作!尝试:在 dbo.[v](ed) 上创建索引 IDX_SOMETHING;
    猜你喜欢
    • 2012-03-01
    • 2011-02-16
    • 2011-07-16
    • 1970-01-01
    • 2010-10-27
    • 2017-04-19
    • 2021-04-24
    • 2010-11-04
    • 1970-01-01
    相关资源
    最近更新 更多