Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Liaison de schéma avec fonction de colonne calculée

Il est impossible d'ajouter un index sur une colonne calculée, sauf si c'est déterministe.

"Les fonctions déterministes renvoient toujours le même résultat chaque fois qu'elles sont appelées avec un ensemble spécifique de valeurs d'entrée et étant donné le même état de la base de données. Les fonctions non déterministes peuvent renvoyer des résultats différents chaque fois qu'elles sont appelées avec un ensemble spécifique de valeurs d'entrée même si l'état de la base de données auquel ils accèdent reste le même."

Exemple :

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

Vous devez spécifier PERSISTED pour les types de données imprécis comme [real] et [float] , dans d'autres cas, vous pouvez créer librement un index sur une vue avec une colonne calculée ([décimal] sera OK).