È impossibile aggiungere un indice su una colonna calcolata, a meno che non sia deterministico.
"Le funzioni deterministiche restituiscono sempre lo stesso risultato ogni volta che vengono chiamate con uno specifico insieme di valori di input e dato lo stesso stato del database. Le funzioni non deterministiche possono restituire risultati diversi ogni volta che vengono chiamate con uno specifico insieme di valori di input anche se lo stato del database a cui accedono rimane lo stesso."
- Creazione di indici su colonne calcolate
- Linee guida per la progettazione delle funzioni definite dall'utente
Esempio:
CREATE FUNCTION dbo.FuncA()
RETURNS [float]
WITH SCHEMABINDING -- required option
BEGIN
RETURN 1.0 -- DB engine parses body, and marks this func. as 'deterministic'
END
GO
CREATE TABLE TableA (
K int primary key clustered,
A AS dbo.FuncA() PERSISTED -- must be persisted
)
GO
CREATE VIEW ViewA
WITH SCHEMABINDING -- required option
AS
SELECT K, A FROM dbo.TableA
GO
CREATE UNIQUE CLUSTERED INDEX IDX1 ON dbo.ViewA (K, A)
GO
Devi specificare PERSISTED
per tipi di dati imprecisi come [real]
e [float]
, in altri casi puoi creare liberamente un indice su una vista con colonna calcolata ([decimale] andrà bene).