Nie można dodać indeksu do kolumny wyliczanej, chyba że jest to deterministyczne.
"Funkcje deterministyczne zawsze zwracają ten sam wynik za każdym razem, gdy są wywoływane z określonym zestawem wartości wejściowych i mają ten sam stan bazy danych. Funkcje niedeterministyczne mogą zwracaćróżne wyniki za każdym razem, gdy są wywoływane z określonym zestawem wartości wejściowych nawet jeśli baza danych stwierdza, że mają dostęp, pozostaje taka sama."
- Tworzenie indeksów w kolumnach przeliczonych
- Wytyczne dotyczące projektowania funkcji zdefiniowanych przez użytkownika
Przykład:
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
Musisz określić PERSISTED
dla nieprecyzyjnych typów danych, takich jak [real]
i [float]
, w innym przypadku możesz dowolnie utworzyć indeks na widoku z wyliczoną kolumną ([dziesiętny] będzie OK).