Nelze vytvořit index na viditelném místě s uživatelem definované funkce v SQL Server

hlasů
6

V SQL Server 2005, Snažím se používat uživatelem definované funkce v indexované zobrazení, který bude použit v fulltextového indexu. Byl jsem schopen dostat UDF pracovat s uložené procedury a zobrazení v pochybnost. Ale když se snažím vytvořit index na zobrazení dostanu následující chybu ...

Nelze vytvořit index na pohled „DevDatabase.dbo.View_PersonSearch“, protože funkce „dbo.GetCurrentImage“ odkazuje pohledu provádí uživatele nebo systému přístup k datům.

Já jsem agitoval tím. Níže je uveden příklad toho, co se snažím dělat. Mám něco chybí nebo je to vůbec možné?

User Defined Function

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

Pohled s vytvořením indexu

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
Položena 10/03/2009 v 17:43
zdroj uživatelem
V jiných jazycích...                            


2 odpovědí

hlasů
12

Podle této stránky :

Všechny funkce, které odkazuje k indexované zobrazení musí být deterministický; deterministické funkce vrátí stejnou hodnotu pokaždé, když jste použil se stejnými argumenty.

GetCurrentImage není deterministický, pokud jde o jeho parametry - používá vybrané, což znamená, že výsledky se mohou měnit, jak se mění dat - takže každý pohled použitím nemůže být indexován.

Odpovězeno 10/03/2009 v 17:48
zdroj uživatelem

hlasů
0

Tam je nedávný dokumentace: https://docs.microsoft.com/en-us/sql/relational-databases/views/create-indexed-views?view=sql-server-2016

Pod Additional Requirementsříká:The data access property of a user-defined function must be NO SQL, and external access property must be NO.

Vy můžete zjistit UDF pomocí následujícího příkazu

    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;

První tři by měla 1, poslední dva musí být 0pro funkce, které mají být použity v indexované zobrazení.

Odpovězeno 06/08/2019 v 18:16
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more