8

在类型的计算列上创建索引nvarchar会引发以下错误:

无法在表“MyTable”上创建索引或统计信息“MyIndex”,因为计算列“MyColumn”不精确且未保留。考虑从索引或统计键中删除列或将计算列标记为持久。

不精确的列是什么意思?

更新。定义如下:

alter table dbo.MyTable
    add [MyColumn] as dbo.MyDeterministicClrFunction(MyOtherColumn)
go  
create index MyIndex on dbo.MyTable(MyColumn)
go

更新2。MyDeterministicClrFunction定义如下:

[SqlFunction(IsDeterministic = true)]
public static SqlString MyDeterministicClrFunction(SqlString input)
{
    return input;
}
4

3 回答 3

9

根据 MSDN,CLR 函数列必须被持久化才能被索引:

任何包含公共语言运行时 (CLR) 表达式的计算列必须是确定性的并标记为 PERSISTED,然后才能对该列建立索引。计算列定义中允许使用 CLR 用户定义类型表达式。只要类型是可比较的,就可以为其类型为 CLR 用户定义类型的计算列建立索引。有关详细信息,请参阅 CLR 用户定义的类型。

坚持这个专栏,我怀疑它会起作用。

于 2012-05-07T15:07:39.767 回答
6

SQL 服务器文档

任何浮点数或实数表达式都被认为是不精确的,不能作为索引的键;浮点数或实数表达式可以在索引视图中使用,但不能用作键。这也适用于计算列。任何函数、表达式或用户定义的函数如果包含任何浮点或实数表达式,则被认为是不精确的。这包括逻辑的(比较)。

于 2012-05-07T14:54:25.077 回答
1

你有没有尝试过:

[SqlFunction(IsDeterministic=true, IsPrecise=true)]

http://msdn.microsoft.com/en-us/library/orm-9780596101404-02-12.aspx

http://msdn.microsoft.com/en-us/library/ms189292.aspx

听起来错误消息具有误导性,因为 CLR 计算列无论如何都必须持久化(要被索引)。

于 2012-05-07T15:20:58.600 回答