Det er umuligt at tilføje indeks på en beregnet kolonne, medmindre det er deterministisk.
"Deterministiske funktioner returnerer altid det samme resultat, hver gang de kaldes med et bestemt sæt inputværdier og givet den samme tilstand af databasen. Ikke-deterministiske funktioner kan returnere forskellige resultater, hver gang de kaldes med et specifikt sæt inputværdier selvom databasen angiver, at de har adgang, forbliver den samme."
Eksempel:
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
Du skal angive PERSISTED
for upræcise datatyper som [real]
og [float]
, i andre tilfælde kan du frit oprette et indeks på en visning med beregnet kolonne ([decimal] vil være OK).