Невозможно создать индекс для представления с помощью определяемой пользователем функции в SQL Server

StackOverflow https://stackoverflow.com/questions/631715

Вопрос

В 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
Это было полезно?

Решение

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

  

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top