Es imposible agregar un índice en una columna calculada, a menos que sea determinista.
"Las funciones deterministas siempre devuelven el mismo resultado cada vez que se las llama con un conjunto específico de valores de entrada y se les da el mismo estado de la base de datos. Las funciones no deterministas pueden devolver resultados diferentes cada vez que se las llama con un conjunto específico de valores de entrada incluso si el estado de la base de datos al que acceden sigue siendo el mismo".
- Creación de índices en columnas calculadas
- Directrices de diseño de funciones definidas por el usuario
Ejemplo:
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
Tienes que especificar PERSISTED
para tipos de datos imprecisos como [real]
y [float]
, en otro caso, puede crear libremente un índice en una vista con una columna calculada ([decimal] estará bien).