Het is onmogelijk om een index toe te voegen aan een berekende kolom, tenzij deze deterministisch is.
"Deterministische functies retourneren altijd hetzelfde resultaat wanneer ze worden aangeroepen met een specifieke set invoerwaarden en gegeven dezelfde status van de database. Niet-deterministische functies kunnen verschillende resultaten retourneren elke keer dat ze worden aangeroepen met een specifieke set invoerwaarden zelfs als de database aangeeft waartoe ze toegang hebben, blijft hetzelfde."
- Indexen maken op berekende kolommen
- Richtlijnen voor het ontwerpen van door de gebruiker gedefinieerde functies
Voorbeeld:
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
U moet PERSISTED
opgeven voor onnauwkeurige gegevenstypen zoals [real]
en [float]
, in andere gevallen kunt u vrijelijk een index maken op een weergave met berekende kolom ([decimaal] is OK).