SQL Server索引视图列精度

Jef*_*eff 1 sql-server indexing sql-server-2005 indexed-view

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

无法在视图....'上创建索引,因为WHERE或GROUP BY子句中视图引用的列'Amount'不精确。考虑从视图中删除该列,或者精确地更改该列。

有问题的列的数据类型是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]);
')
Run Code Online (Sandbox Code Playgroud)

rsb*_*rro 5

文档确实表明问题出在real数据类型上(请参见“精度要求”)。如果您想在WHERE视图的子句中使用该列并对该视图建立索引,则需要将该列更改为精确的数据类型(即DECIMAL(9, 2))。

编辑
文档为存在此限制的原因提供了更清晰的说明。在“确定性函数”部分中:

即使表达式是确定性的,如果它包含浮点表达式,确切的结果也可能取决于处理器的体系结构或微代码的版本。为了确保数据完整性,此类表达式只能作为索引视图的非关键列参与。不包含浮点表达式的确定性表达式称为精确表达式。只有精确的确定性表达式才能参与键列以及索引视图的WHERE或GROUP BY子句。

希望能有所帮助。

  • 另外:将真实数据类型用于会计是完全忽略的。最终可能会导致软件意外计算错误。始终为我们提供精确的数据类型和整数。 (4认同)