0

假设有一个表,例如:

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”?

4

1 回答 1

2

导致它不精确的不是结果类型——而是它对float输入值的依赖。除了您已经排除的解决方案之外,您无能为力 - 将其标记为PERSISTED.

于 2013-07-16T12:11:08.110 回答