2012-01-25 36 views
4

我有一个索引视图,我基本上需要做到这一点SQL服务器ISDATE在索引视图

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

试图创建索引率:

无法对视图 创建索引” .. ..'。函数 'isdate'产生不确定的结果。使用确定性系统 功能,或修改用户定义的函数返回确定性 结果。

MSDN说

ISDATE是确定性的只有当您使用转换函数中使用它,
如果指定了CONVERT样式参数,风格 不等于0,100,9,或109.

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

但我不知道这意味着什么都没有。至于我可以告诉大家,我用它与CONVERT功能....

任何方式解决此问题?

回答

4

它应该是,如果在所有:

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

,但是,你不使用WITH CONVERT ISDATE,因为有像

ISDATE(CONVERT(varchar,ColumnName,112)) 

没有嵌套转换的返回值是毫无表情依赖于诸如语言设置之类的东西,因此它是非确定性行为。没有“外部”知识,就不可能根据单独的输入来预测获得的结果。

+0

所以它是不可能与索引视图使用ISDATE?我能做些什么吗? – Jeff

+2

你可以建立自己的标量函数,是确定性和使用,如果它是值得的麻烦你。你真的需要这个视图被严重索引吗? – Mithrandir

0

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 
+0

你没有声明来创建索引....这就是它失败的地方。 – Jeff

+0

视图的索引在哪里?你的观点没有索引,将工作正常! TRY:CREATE INDEX IDX_SOMETHING ON dbo。[v](ed); – Mithrandir

+0

请检查编辑。 – Pankaj