什么是SQL Server中的不精确列?

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)

JNK*_*JNK 9

根据MSDN,必须保留CLR函数列以进行索引:

包含公共语言运行时(CLR)表达式的任何计算列必须是确定性的,并且在列可以编制索引之前标记为PERSISTED.计算列定义中允许使用CLR用户定义的类型表达式.只要类型具有可比性,就可以对其类型为CLR用户定义类型的计算列进行索引.有关更多信息,请参阅CLR用户定义类型.

保留专栏,我怀疑它会起作用.


Eri*_*lje 6

SQL Server文档:

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

  • 你可以读到我的列有'nvarchar`类型. (2认同)