Impossible de créer un index sur la vue avec la fonction définie par l'utilisateur dans SQL Server
-
08-07-2019 - |
Question
Dans SQL Server 2005, j'essaie d'utiliser une fonction définie par l'utilisateur dans une vue indexée qui sera utilisée dans un index en texte intégral. J'ai pu faire en sorte que l'UDF fonctionne avec une procédure stockée et la vue en question. Mais, lorsque j'essaie de créer un index sur la vue, l'erreur suivante s'affiche:
Impossible de créer un index dans la vue " DevDatabase.dbo.View_PersonSearch " parce que la fonction " dbo.GetCurrentImage " référencé par la vue effectue un accès aux données utilisateur ou système.
Cela me laisse perplexe. Vous trouverez ci-dessous un exemple de ce que j'essaie de faire. Est-ce que je manque quelque chose ou est-ce même possible?
Fonction définie par l'utilisateur
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER FUNCTION [dbo].[GetCurrentImage](@Person_ID int)
RETURNS int
WITH SCHEMABINDING
AS
BEGIN
-- Declare the return variable here
DECLARE @Img_ID int
SET @Img_ID = (**sql that selects image** )
RETURN @Img_ID
END
GO
Vue avec création d'index
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER VIEW [dbo].[View_PersonSearch]
WITH SCHEMABINDING
AS
SELECT Person_ID,
(**Select fields to search on**) AS SearchArea,
dbo.GetCurrentImage(Person_ID) AS FK_Img_ID
FROM dbo.Person
GO
CREATE UNIQUE CLUSTERED INDEX Index_Person_ID ON [View_PersonSearch](Person_ID)
GO
La solution
Selon cette page :
Toutes les fonctions référencées dans un indexé la vue doit être déterministe; les fonctions déterministes renvoient la même valeur à chaque fois qu'ils sont invoqués avec les mêmes arguments.
GetCurrentImage n’est pas déterministe en ce qui concerne ses paramètres. Il utilise une sélection, ce qui signifie que les résultats peuvent changer en fonction des données. Ainsi, aucune vue l’utilisant ne peut être indexée.