Невозможно создать индекс для представления с помощью определяемой пользователем функции в SQL Server - PullRequest
7 голосов
/ 10 марта 2009

В SQL Server 2005 я пытаюсь использовать пользовательскую функцию в индексированном представлении, которое будет использоваться в полнотекстовом индексе. Я был в состоянии заставить UDF работать с хранимой процедурой и рассматриваемым представлением. Но когда я пытаюсь создать индекс для представления, я получаю следующую ошибку ...

Невозможно создать индекс для представления "DevDatabase.dbo.View_PersonSearch", поскольку функция "dbo.GetCurrentImage", на которую ссылается представление, выполняет доступ к данным пользователя или системы.

Я озадачен этим. Ниже приведен пример того, что я пытаюсь сделать. Я что-то упустил или это вообще возможно?

Пользовательская функция

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

Просмотр с созданием индекса

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

1 Ответ

13 голосов
/ 10 марта 2009

Согласно этой странице :

Любые функции, на которые есть ссылки в индексированном взгляд должен быть детерминированным; детерминированные функции возвращают одно и то же значение каждый раз, когда они вызываются с теми же аргументами.

GetCurrentImage не является детерминированным в отношении своих параметров - он использует выбор, что означает, что результаты могут изменяться при изменении данных - поэтому любое представление, использующее его, не может быть проиндексировано.

...