J'essaie de créer une vue indexée où l'index est sur un champ de la vue qui est un hachage d'un tas de colonnes de la table sous-jacente dans la vue.
Voici un exemple:
CREATE VIEW CoolHashedView WITH SCHEMABINDING AS
SELECT
KeyId,
CONVERT
(
VARCHAR(34),
HASHBYTES('MD5', TextColumn1 + '||' + TextColumn2 + '||' + CAST(DateColumn1 AS VARCHAR(50)),
2
) AS HashedData
FROM dbo.BoringTable;
CREATE UNIQUE CLUSTERED INDEX IX_CoolHashedView_KeyId_HashedData ON CoolHashedView (KeyId, HashedData);
Lorsque j'essaie de créer l'index ci-dessus, il échoue et l'erreur suivante est levée:
Msg 2729, niveau 16, état 1, ligne 26 La colonne 'HashedData' dans la vue 'CoolHashedView' ne peut pas être utilisée dans un index ou des statistiques ou comme clé de partition car elle n'est pas déterministe.
Lorsque je supprime le champ de date de la fonction HASHBYTEs, l'index clusterisé crée ensuite avec succès.
Je suppose que cela a quelque chose à voir avec les différentes façons de formater une date ou différents fuseaux horaires? ... est-ce que je me réchauffe?
CAST n'est pas déterministe car le format de la date peut changer en fonction des paramètres du serveur (c'est-à-dire que sous la compatibilité avant 110, le format de date par défaut est 0 => "12 décembre 2019 14h11" et la sortie dépend de la langue).
Pour le rendre déterministe, utilisez CONVERT et
le paramètre de style doit être une constante. De plus, les styles inférieurs ou égaux à 100 ne sont pas déterministes, à l'exception des styles 20 et 21. Les styles supérieurs à 100 sont déterministes, à l'exception des styles 106, 107, 109 et 113. (d'après la documentation ci-dessous)
Plus de documentation sur: Fonctions déterministes et non déterministes