2012-01-25 35 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