我有這樣一個表,計算列「一類是用作鍵無效的」:無法添加索引持久化計算列,因爲它是
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