假设有一个表,例如:
create table #data
(
ID int identity(1, 1),
Value float,
VCluster as (ID % 5),
VType as (cast(case when Value > 1 then 1 when Value < -1 then -1 else 0 end as int))
)
我需要在其计算列上创建两个索引,如下所示:
create index #ix_data_1 on #data (VCluster)
create index #ix_data_2 on #data (VType)
第一个创建良好,但是当我尝试创建第二个时,我收到错误消息:“无法在表'#data'上创建索引或统计'#ix_data_2',因为计算列'VType '不精确而且没有坚持......“
我查询系统视图:
select c.name, c.system_type_id, t.name as type_name
from tempdb.sys.columns c
join tempdb.sys.types t on t.system_type_id = c.system_type_id
where c.object_id = object_id('tempdb..#data')
order by c.column_id
得到以下结果:
name system_type_id type_name
---------- -------------- ----------
ID 56 int
Value 62 float
VCluster 56 int
VType 56 int
所以,VType
列的类型是int,但似乎不知何故它“不是非常int”。
我知道我可以创建列persisted
并创建索引,但有没有办法避免它并使列VType
“100%int”?
答案 0 :(得分:2)
这不是导致其不精确的结果类型 - 它依赖于float
输入值。除了你已经排除的解决方案之外,你无能为力 - 将其标记为PERSISTED
。