2009-03-10 11 views
6

W programie SQL Server 2005 próbuję użyć funkcji zdefiniowanej przez użytkownika w indeksowanym widoku, który będzie używany w indeksie pełnotekstowym. Byłem w stanie zmusić UDF do pracy z procedurą składowaną i widokiem, o którym mowa. Ale gdy próbuję utworzyć indeks na widoku pojawia się następujący błąd:Nie można utworzyć indeksu w widoku z funkcją zdefiniowaną przez użytkownika w SQL Server

Nie można utworzyć indeksu w widoku "DevDatabase.dbo.View_PersonSearch", ponieważ funkcja "dbo.GetCurrentImage", do której odwołuje się widok, wykonuje użytkownika lub dostęp do danych systemowych.

Jestem zaskoczony tym. Poniżej znajduje się przykład tego, co próbuję zrobić. Czy czegoś brakuje, czy jest to możliwe?

User Defined Function

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 

Widok z tworzenia indeksu

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 

Odpowiedz

12

według this page:

Wszelkie funkcje użyte w indeksowanejWidokmusi być deterministyczny; funkcje deterministyczne zwracają wartość za każdym razem, gdy są wywoływane z tymi samymi argumentami.

GetCurrentImage nie jest deterministyczny w odniesieniu do swoich parametrów - korzysta z selekcji, co oznacza, że ​​wyniki mogą się zmieniać wraz ze zmianą danych - więc nie można indeksować widoku korzystającego z niego.

+0

ahhh ... Rozumiem. Dziękuję, że przynieście mi to na światło. – Eddie

+1

Jakie jest rozwiązanie? –

+0

Ja też chciałbym wiedzieć, jak przezwyciężyliście ten problem. – Jeremy

Powiązane problemy