Mam tabeli tak z kolumną wyliczona:Nie można dodać indeks utrzymywał obliczane kolumny, ponieważ jest „typu, który jest nieważny do użytku jako klucz”
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 */
)
Jest on tworzony w porządku, a kolumna Digits
działa świetnie zgodnie z oczekiwaniami, ALE nie zachowuje się jak kolumna "PERSISTED". Kiedy wykonuję zapytanie z Digits
w klauzuli WHERE, jest BARDZO spowolnione. Kiedy próbuję dodać indeks do kolumny Cyfry, dostaję: Column 'Digits' in table 'PhoneNumbers' is of a type that is invalid for use as a key column in an index.
Wygląda na to, że kolumna nie jest tak naprawdę traktowana jako PERSISTED i jest przeliczana na każde zapytanie i nie pozwala mi dodać indeksu.
REGEXREPLACE jest C# funkcja CLR zdefiniowane następująco:
[SqlFunction(IsDeterministic = true, IsPrecise = true)]
public static SqlString RegExReplace(SqlString expression, SqlString pattern, SqlString replace)
Wszelkie pomysły, w jaki sposób, aby ta kolumna Digits
działać jak kolumny lub utrwalonej pozwala mi dodać indeks ?!
Dziękujemy!
Nie zaprojektowałbym tak. Nie przechowywałbym niczego poza cyframi i używałbym przedniej strony do wymuszania jakichkolwiek wzorów. To jest overdesign, IMO. –
Tak, prawdopodobnie masz rację, ale jest to starsza baza danych, która ma już wiele rekordów i wiele punktów wejścia dla tych rekordów. Pomyślałem, że może to być łatwa łatka, aby uzyskać tylko liczby bez konieczności zmiany kodu w 10 różnych miejscach. (Kolumna "Cyfry" jest w rzeczywistości nową kolumną, a nie częścią oryginalnego projektu) – JerSchneid