我有这样一个表,计算列“一类是用作键无效的”:无法添加索引持久化计算列,因为它是
CREATE TABLE PhoneNumbers
(
[PhoneNumberID] int identity(1,1) not null primary key clustered,
[Number] varchar(20), /* Entire number, like (800) 555-5000 */
[Digits] AS dbo.RegExReplace(Number, '[^0-9]', '') PERSISTED /* Like 8005555000 */
)
它创造精品,和Digits
列的预期效果很好,但它似乎不像“PERSISTED”列。当我在WHERE子句中使用Digits
进行查询时,它非常慢。当我尝试将索引添加到数字列时,我得到:Column 'Digits' in table 'PhoneNumbers' is of a type that is invalid for use as a key column in an index.
似乎该列并未真正被视为PERSISTED,并且正在每个查询中重新计算,因此不会让我添加索引。
的REGEXREPLACE是定义为一个C#CLR函数如下:
[SqlFunction(IsDeterministic = true, IsPrecise = true)]
public static SqlString RegExReplace(SqlString expression, SqlString pattern, SqlString replace)
如何获取Digits
列像一个持久列或允许我添加一个索引任何想法?
谢谢!
我不会这样设计的。我不会存储除数字以外的任何内容,并且我会使用前端来执行任何模式。它是过度设计,IMO。 – 2012-01-31 02:50:57
是的,你可能是对的,但是这是一个遗留数据库,它已经有很多很多记录和这些记录的许多入口点。我认为这可能是一个简单的补丁,可以在不需要更改10个不同地方的代码的情况下获取数字。 (“数字”栏实际上是一个新栏,不是原始设计的一部分) – JerSchneid 2012-01-31 03:07:25