【问题标题】:What is imprecise column in SQL Server?SQL Server 中的不精确列是什么?
【发布时间】:2012-05-16 01:49:51
【问题描述】:

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;
}

【问题讨论】:

  • 您尝试使用什么公式计算列值?
  • nvarchar(xx) 还是nvarchar(max)
  • MyOtherColumn 其他列是nvarchar(50)
  • 好的,所以第 1 步是将PERSISTED 添加到您的ALTER TABLE 语句中
  • 我不想保留那一栏,我想让它准确:)

标签: sql sql-server tsql sql-server-2008-r2


【解决方案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 计算列无论如何都必须持久化(以被索引)。

【讨论】:

  • +1 谢谢,但它给出了更好的错误消息:Cannot create index or statistics 'MyIndex' on table 'MyTable' because SQL Server cannot verify that key column 'MyColumn' is precise and deterministic. Consider removing column from index or statistics key, marking computed column persisted, or using non-CLR-derived column in key.
【解决方案2】:

Per MSDN, CLR Function columns must be persisted to be indexed:

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

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

【讨论】:

  • @TN。我认为错误消息可能不是特定于这种情况,而是与此错误相关的更一般的消息。
【解决方案3】:

来自SQL server documentation

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

【讨论】:

  • @TN - 可能是因为它没有指定生成的 varchar 的大小?
  • 也可能是因为没有持久化
  • @Eric Petroelje 如何在 CLR 函数中指定大小?
  • @TN - 我认为 JNK 可能是正确的。这里有更多关于不精确值和 CLR 函数的讨论(以及为什么存在该要求)。不过,我不太清楚它是如何适用于您的情况的……technet.microsoft.com/en-us/library/…
猜你喜欢
  • 2017-10-28
  • 1970-01-01
  • 1970-01-01
  • 2018-07-06
  • 1970-01-01
  • 2014-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多