TN.*_*TN. 8 sql t-sql sql-server sql-server-2008-r2
在类型的计算列上创建索引nvarchar
会引发以下错误:
无法在表'MyTable'上创建索引或统计信息'MyIndex',因为计算列'MyColumn'不精确且不持久.请考虑从索引或统计信息键中删除列或标记已保留的计算列.
什么是不精确的列是什么意思?
UPDATE.定义如下:
alter table dbo.MyTable
add [MyColumn] as dbo.MyDeterministicClrFunction(MyOtherColumn)
go
create index MyIndex on dbo.MyTable(MyColumn)
go
Run Code Online (Sandbox Code Playgroud)
UPDATE2.的MyDeterministicClrFunction
定义如下:
[SqlFunction(IsDeterministic = true)]
public static SqlString MyDeterministicClrFunction(SqlString input)
{
return input;
}
Run Code Online (Sandbox Code Playgroud)
包含公共语言运行时(CLR)表达式的任何计算列必须是确定性的,并且在列可以编制索引之前标记为PERSISTED.计算列定义中允许使用CLR用户定义的类型表达式.只要类型具有可比性,就可以对其类型为CLR用户定义类型的计算列进行索引.有关更多信息,请参阅CLR用户定义类型.
保留专栏,我怀疑它会起作用.
任何浮动或真实表达都被认为是不精确的,不能成为索引的关键; float或real表达式可以在索引视图中使用,但不能用作键.对于计算列也是如此.如果任何函数,表达式或用户定义函数包含任何浮点或实数表达式,则认为它们是不精确的.这包括逻辑的(比较).