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
Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top