【问题标题】:Cannot create index on view with User Defined Function in SQL Server无法使用 SQL Server 中的用户定义函数在视图上创建索引
【发布时间】:2010-10-12 12:22:34
【问题描述】:

在 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

【问题讨论】:

    标签: sql-server indexing views user-defined-functions


    【解决方案1】:

    根据this page

    索引中引用的任何函数 视图必须是确定性的; 确定性函数返回 每次调用它们时都有相同的值 具有相同的论点。

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

    【讨论】:

    • 啊……我现在明白了。感谢您为我带来了这一点。
    • 我也很想知道您是如何克服这个问题的。
    【解决方案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,才能在索引视图中使用函数。

    【讨论】:

      猜你喜欢
      • 2023-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-23
      相关资源
      最近更新 更多