2011-11-26 94 views
0

我試圖創建一個索引視圖,並收到以下錯誤創建索引:的SQL Server索引視圖列精度

無法對視圖 創建索引......」 因爲列‘金額’ WHERE或GROUP BY子句中的視圖所引用的內容不精確。考慮從視圖中刪除列 ,或將列更改爲精確。

有問題的列的數據類型爲real,我猜是問題所在?

解決此問題的適當方法是什麼?我可以在視圖SQL中進行轉換以消除「不精確性」嗎?

視圖SQL低於指定:

EXEC(' 
    CREATE VIEW model.ReceivableBillableParties 
    WITH SCHEMABINDING 
    AS 
     SELECT pf.Id AS Id 
     , pf.InsuranceId AS InsuranceId 
     , pf.FinancialInsType AS InsuranceType 
     , pr.ReceivableId 
     FROM dbo.Receivables pr 
     INNER JOIN dbo.Demographics pd ON pd.PersonId = pr.PersonId 
     INNER JOIN dbo.Appointments ap ON ap.AppointmentId = pr.AppointmentId 
     INNER JOIN dbo.Financiasl pf ON pf.PersonId = pf.PersonId 
     INNER JOIN dbo.PracticeInsurers pri ON pri.InsurerId = pf.FinancialInsurerId 
     WHERE pri.Amount = 0 
') 

EXEC(' 
    CREATE UNIQUE CLUSTERED INDEX [IX_ReceivableBillableParties] 
    ON model.ReceivableBillableParties ([Id]); 
') 
+3

您需要指定SQL Server版本....和您的視圖定義。我不應該提醒你,他們是必需的(考慮到你使用的時間長度)... –

+0

我很高興地提供你需要的任何信息。如果你想成爲斯尼德或居高臨下的人,可以去別的地方,以某種形式的教練來提升自我。您的幫助不被讚賞。 – Jeff

+0

而以100k +的名譽,你會認爲很明顯像「我不應該提醒你」這樣的評論確實不具有建設性。 – Jeff

回答

4

documentation確實表明,問題在於與real數據類型(見精度要求)。如果要在視圖的WHERE子句中使用該列,併爲該視圖編制索引,則需要將列更改爲精確的數據類型(即DECIMAL(9, 2))。

編輯
documentation提供了爲什麼這個限制存在更清楚的解釋。從部分「確定性函數」:

即使一個表達式是確定性的,如果它包含漂浮 表達式,確切的結果可依賴於處理器架構 或微代碼的版本。爲確保數據完整性,此類表達式只能作爲索引視圖的非關鍵字列參與。 不包含浮點表達式的確定性表達式稱爲精確的 。 只有精確的確定性表達式可以參與 的鍵列和索引視圖的WHERE或GROUP BY子句。

希望有所幫助。

+4

另外:使用真實的數據類型進行會計嚴重忽視。最終會導致軟件意外失算。總是相應地提供精確的數據類型和圓整數字。 – TomTom

+0

@TomTom同意。 – rsbarro