Domanda

In SQL Server 2005, sto cercando di utilizzare una funzione definita dall'utente in una vista indicizzata che verrà utilizzata in un indice full-text. Sono stato in grado di far funzionare l'UDF con una procedura memorizzata e la vista in questione. Ma, quando provo a creare un indice sulla vista, viene visualizzato il seguente errore ...

Impossibile creare l'indice nella vista " DevDatabase.dbo.View_PersonSearch " perché la funzione " dbo.GetCurrentImage " a cui fa riferimento la vista esegue l'accesso ai dati dell'utente o del sistema.

Sono sconcertato da questo. Di seguito è riportato un esempio di ciò che sto cercando di fare. Mi sto perdendo qualcosa o è possibile?

Funzione definita dall'utente

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

Visualizza con creazione indice

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
È stato utile?

Soluzione

Secondo questa pagina :

  

Qualsiasi funzione referenziata in un indice   la vista deve essere deterministica;   le funzioni deterministiche restituiscono il   stesso valore ogni volta che vengono invocati   con gli stessi argomenti.

GetCurrentImage non è deterministico rispetto ai suoi parametri - utilizza una selezione, il che significa che i risultati possono cambiare quando i dati cambiano - quindi qualsiasi vista che lo utilizza non può essere indicizzata.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top