Невозможно создать индекс для представления с помощью определяемой пользователем функции в SQL Server
-
08-07-2019 - |
Вопрос
В 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 не является детерминированным в отношении своих параметров - он использует выбор, что означает, что результаты могут изменяться при изменении данных - поэтому любое представление, использующее его, не может быть проиндексировано.