11

在 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
4

2 回答 2

16

根据此页面

索引视图中引用的任何函数都必须是确定性的;每次使用相同的参数调用确定性函数时,它们都会返回相同的值。

GetCurrentImage 的参数不是确定性的——它使用一个选择,这意味着结果可能会随着数据的变化而变化——所以任何使用它的视图都不能被索引。

于 2009-03-10T18:48:06.857 回答
2

最近有一个文档:https ://docs.microsoft.com/en-us/sql/relational-databases/views/create-indexed-views?view=sql-server-2016

Additional Requirements它下面说:The data access property of a user-defined function must be NO SQL, and external access property must be NO.

您可以使用以下语句检查您的 UDF

    SELECT ObjectPropertyEx(Object_Id('dbo.GetCurrentImage'), N'IsDeterministic') AS deterministic, 
        ObjectPropertyEx(Object_Id('dbo.GetCurrentImage'), N'IsPrecise') AS precise, 
        ObjectPropertyEx(Object_Id('dbo.GetCurrentImage'), N'IsSystemVerified') AS verified, 
        ObjectPropertyEx(Object_Id('dbo.GetCurrentImage'), N'UserDataAccess') AS UserDataAccess,
        ObjectPropertyEx(Object_Id('dbo.GetCurrentImage'), N'SystemDataAccess') AS SystemDataAccess;

前三个应该给出1,后两个必须是0在索引视图中使用的函数。

于 2019-08-06T16:16:13.743 回答