假设有一个表,例如:
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”?