sql >> Base de Datos >  >> RDS >> Sqlserver

Enlace de esquema con función de columna calculada

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".

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).