Avez-vous déjà rencontré une erreur lors de la création d’une vue dans SQL Server ? Une des erreurs courantes que vous pourriez rencontrer est l’erreur 1949, qui indique “Impossible de créer un index sur la vue. La fonction produit des résultats non déterministes.”
En termes simples, une fonction non déterministe est une fonction qui peut renvoyer des résultats différents à chaque appel avec le même ensemble de valeurs d’entrée. Cela peut poser des problèmes lors de la création d’un index sur une vue qui utilise une telle fonction.
SQL Server fournit une liste de fonctions considérées comme non déterministes, notamment des fonctions telles que GETDATE, NEWID et CHARINDEX, entre autres. Si vous utilisez l’une de ces fonctions dans votre vue, vous ne pourrez pas créer d’index sur cette vue.
Jetons un coup d’œil à un exemple pour mieux comprendre :
USE TempDB
GO
-- Créer une vue avec la fonction non déterministe GETDATE
CREATE VIEW TempView
WITH SCHEMABINDING
AS
SELECT GETDATE() AS CurrentTime, 1 AS FirstCol
GO
-- Vérifier les données de la vue
SELECT *
FROM TempView
GO
-- Tentative de création de l'index
CREATE UNIQUE CLUSTERED INDEX [IX_ClusteredIndex_TempView] ON [dbo].[TempView]
(
FirstCol ASC
) ON [PRIMARY]
GO
/* La requête ci-dessus générera l'erreur suivante :
Msg 1949, Level 16, State 1, Line 1
Impossible de créer un index sur la vue 'tempdb.dbo.TempView'.
La fonction 'getdate' produit des résultats non déterministes.
Utilisez une fonction système déterministe,
ou modifiez la fonction définie par l'utilisateur pour renvoyer des résultats déterministes.
*/
-- Modifier la vue et supprimer la fonction non déterministe GETDATE
ALTER VIEW TempView
WITH SCHEMABINDING
AS
SELECT 1 AS FirstCol
GO
-- La création de l'index fonctionnera maintenant avec succès
CREATE UNIQUE CLUSTERED INDEX [IX_ClusteredIndex_TempView] ON [dbo].[TempView]
(
FirstCol ASC
) ON [PRIMARY]
GO
Comme vous pouvez le voir dans l’exemple ci-dessus, lorsque nous avons essayé de créer un index sur la vue qui utilisait la fonction non déterministe GETDATE, nous avons rencontré l’erreur 1949. Cependant, après avoir supprimé la fonction non déterministe de la vue, nous avons pu créer l’index avec succès.
Il est important de noter que supprimer la fonction non déterministe de la vue ne sera pas toujours la solution idéale, surtout si la fonction fournit des informations précieuses. Dans de tels cas, vous devrez peut-être trouver d’autres moyens d’atteindre le résultat souhaité.
Comprendre les fonctions non déterministes et leur impact sur la création d’index dans SQL Server peut vous aider à éviter les erreurs et à assurer le bon fonctionnement de votre base de données. Il est toujours recommandé de passer en revue les fonctions que vous utilisez dans vos vues et de considérer leur déterminisme avant de tenter de créer des index.
Merci de votre lecture ! Si vous avez des questions ou des commentaires, n’hésitez pas à les laisser ci-dessous.