Es ist unmöglich, einen Index zu einer berechneten Spalte hinzuzufügen, es sei denn, er ist deterministisch.
"Deterministische Funktionen geben immer das gleiche Ergebnis zurück, wenn sie mit einem bestimmten Satz von Eingabewerten aufgerufen werden und denselben Status der Datenbank haben. Nicht deterministische Funktionen können jedes Mal, wenn sie mit einem bestimmten Satz von Eingabewerten aufgerufen werden, unterschiedliche Ergebnisse zurückgeben selbst wenn der Datenbankstatus, auf den sie zugreifen, derselbe bleibt."
Beispiel:
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
Sie müssen PERSISTED
angeben für ungenaue Datentypen wie [real]
und [float]
, andernfalls können Sie einen Index für eine Ansicht mit berechneter Spalte frei erstellen ([dezimal] ist in Ordnung).