Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Schema vincolante con funzione di colonna calcolata

È impossibile aggiungere un indice su una colonna calcolata, a meno che non sia deterministico.

"Le funzioni deterministiche restituiscono sempre lo stesso risultato ogni volta che vengono chiamate con uno specifico insieme di valori di input e dato lo stesso stato del database. Le funzioni non deterministiche possono restituire risultati diversi ogni volta che vengono chiamate con uno specifico insieme di valori di input anche se lo stato del database a cui accedono rimane lo stesso."

Esempio:

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

Devi specificare PERSISTED per tipi di dati imprecisi come [real] e [float] , in altri casi puoi creare liberamente un indice su una vista con colonna calcolata ([decimale] andrà bene).