SQL Server索引视图列精度

时间:2011-11-26 05:13:39

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

我正在尝试创建索引视图,并在创建索引时出现以下错误:

  

无法在视图上创建索引   ....”   因为视图中引用的列'Amount'   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]);
')

1 个答案:

答案 0 :(得分:5)

documentation确实表明问题出在real数据类型上(请参阅精度要求)。如果要在视图的WHERE子句中使用该列并对该视图编制索引,则需要将列更改为精确的数据类型(即DECIMAL(9, 2))。

修改
这个documentation更清楚地解释了为什么存在这种限制。从“确定性函数”部分:

  

即使表达式是确定性的,如果它包含float   表达式,确切的结果可能取决于处理器架构   或微代码的版本。确保数据完整性,这样的表达式   只能作为索引视图的非键列参与。   不包含浮点表达式的确定性表达式是   叫做精确。 只有精确的确定性表达式才能参与   在索引视图的键列和WHERE或GROUP BY子句中。

希望有所帮助。