Impossibile creare l'indice in vista con la funzione definita dall'utente in SQL Server
-
08-07-2019 - |
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
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.