Det är omöjligt att lägga till index på en beräknad kolumn, om det inte är deterministiskt.
"Deterministiska funktioner returnerar alltid samma resultat varje gång de anropas med en specifik uppsättning indatavärden och ges samma tillstånd i databasen. Icketerministiska funktioner kan returnera olika resultat varje gång de anropas med en specifik uppsättning indatavärden även om databasen anger att de åtkomst förblir densamma."
Exempel:
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 måste ange PERSISTED
för oprecisa datatyper som [real]
och [float]
, i andra fall kan du fritt skapa ett index på en vy med beräknad kolumn ([decimal] kommer att vara OK).