我正在尝试创建索引视图,并在创建索引时出现以下错误:
无法在视图上创建索引 ....” 因为视图中引用的列'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]);
')
答案 0 :(得分:5)
documentation确实表明问题出在real
数据类型上(请参阅精度要求)。如果要在视图的WHERE
子句中使用该列并对该视图编制索引,则需要将列更改为精确的数据类型(即DECIMAL(9, 2)
)。
修改强>
这个documentation更清楚地解释了为什么存在这种限制。从“确定性函数”部分:
即使表达式是确定性的,如果它包含float 表达式,确切的结果可能取决于处理器架构 或微代码的版本。确保数据完整性,这样的表达式 只能作为索引视图的非键列参与。 不包含浮点表达式的确定性表达式是 叫做精确。 只有精确的确定性表达式才能参与 在索引视图的键列和WHERE或GROUP BY子句中。
希望有所帮助。