Udostępnij za pomocą


Funkcje skalarne zdefiniowane przez użytkownika dla In-Memory OLTP

Dotyczy:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

W programie SQL Server 2016 (13.x) można tworzyć i usuwać natywnie skompilowane, skalarne funkcje zdefiniowane przez użytkownika. Można również zmienić te funkcje zdefiniowane przez użytkownika. Kompilacja natywna poprawia wydajność oceny funkcji zdefiniowanych przez użytkownika w języku Transact-SQL.

Po zmianie natywnie skompilowanej, skalarnej funkcji zdefiniowanej przez użytkownika aplikacja pozostaje dostępna podczas uruchamiania operacji, a nowa wersja funkcji jest kompilowana.

Aby uzyskać informacje o obsługiwanych konstrukcjach języka T-SQL, zobacz Obsługiwane funkcje dla natywnie skompilowanych modułów języka T-SQL.

Tworzenie, usuwanie i modyfikowanie funkcji zdefiniowanych przez użytkownika

Funkcja CREATE służy do tworzenia natywnie skompilowanej, skalarnej funkcji zdefiniowanej przez użytkownika, funkcji DROP w celu usunięcia funkcji zdefiniowanej przez użytkownika oraz funkcji ALTER w celu zmiany funkcji. FUNKCJA BEGIN ATOMIC WITH jest wymagana dla funkcji zdefiniowanych przez użytkownika.

Aby uzyskać informacje o obsługiwanej składni i wszelkich ograniczeniach, zobacz następujące tematy.

Procedura składowana sp_recompile (Transact-SQL) może być używana z natywnie skompilowaną, skalarną funkcją zdefiniowaną przez użytkownika. Spowoduje to ponowne skompilowane działanie funkcji przy użyciu definicji, która istnieje w metadanych.

W poniższym przykładzie przedstawiono skalarną UDF ze zbioru danych przykładowych AdventureWorks2022.

CREATE FUNCTION [dbo].[ufnLeadingZeros_native](@Value int)   
RETURNS varchar(8)   
WITH NATIVE_COMPILATION, SCHEMABINDING  
AS   
BEGIN ATOMIC WITH (TRANSACTION ISOLATION LEVEL = SNAPSHOT, LANGUAGE = N'English')  
  
    DECLARE @ReturnValue varchar(8);  
    SET @ReturnValue = CONVERT(varchar(8), @Value);  
       DECLARE @i int = 0, @count int = 8 - LEN(@ReturnValue)  
  
    WHILE @i < @count  
       BEGIN  
            SET @ReturnValue = '0' + @ReturnValue;  
            SET @i += 1  
       END  
  
    RETURN (@ReturnValue);  
  
END  

Wywoływanie funkcji zdefiniowanych przez użytkownika

Natywnie skompilowane, skalarne funkcje zdefiniowane przez użytkownika mogą być używane w wyrażeniach w tym samym miejscu co wbudowane funkcje skalarne i interpretowane funkcje zdefiniowane przez użytkownika skalarne. Natywnie skompilowane, skalarne funkcje zdefiniowane przez użytkownika mogą być również używane z instrukcją EXECUTE w instrukcji Transact-SQL i w natywnie skompilowanej procedurze składowanej.

Można użyć tych funkcji zdefiniowanych przez użytkownika skalarnych w natywnie skompilowanych procedurach przechowywania i natywnie skompilowanych funkcjach zdefiniowanych przez użytkownika oraz wszędzie tam, gdzie są dozwolone wbudowane funkcje. Można również używać natywnie skompilowanych, skalarnych funkcji zdefiniowanych przez użytkownika w tradycyjnych modułach Transact-SQL.

Można użyć tych skalarnych funkcji zdefiniowanych przez użytkownika w trybie międzyoperacyjnym, gdzie można stosować funkcję interpretowaną. To użycie podlega ograniczeniom transakcji między kontenerami, zgodnie z opisem w sekcji Obsługiwane poziomy izolacji dla transakcji między kontenerami w temacie Transakcje z tabelami Memory-Optimized. Aby uzyskać więcej informacji na temat trybu interop, zobacz Uzyskiwanie dostępu do tabel pamięciowo-optymalizowanych przy użyciu interpretowanego języka Transact-SQL.

Natywnie skompilowane, skalarne funkcje zdefiniowane przez użytkownika wymagają jawnego kontekstu wykonywania. Aby uzyskać więcej informacji, zobacz EXECUTE AS Clause (Transact-SQL). FUNKCJA EXECUTE AS CALLER nie jest obsługiwana. Aby uzyskać więcej informacji, zobacz EXECUTE (Transact-SQL).

Aby uzyskać obsługiwaną składnię instrukcji Transact-SQL Execute dla skalarnych funkcji zdefiniowanych przez użytkownika, które są natywnie kompilowane, zobacz EXECUTE (Transact-SQL). Aby uzyskać obsługiwaną składnię wykonywania funkcji zdefiniowanych przez użytkownika w natywnie skompilowanej procedurze składowanej, zobacz Obsługiwane funkcje dla natywnie skompilowanych modułów języka T-SQL.

Wskazówki i parametry

Obsługa wskazówek dotyczących tabel, sprzężeń i zapytań wewnątrz natywnie skompilowanych, skalarnych funkcji zdefiniowanych przez użytkownika jest równa obsłudze tych wskazówek dla natywnie skompilowanych procedur składowanych. Podobnie jak w przypadku interpretowanych funkcji zdefiniowanych przez użytkownika, wskazówki dotyczące zapytań zawarte w zapytaniu Transact-SQL odwołujące się do natywnie skompilowanej, skalarnej funkcji zdefiniowanej przez użytkownika nie mają wpływu na plan zapytania dla tej funkcji zdefiniowanej przez użytkownika.

Parametry obsługiwane dla natywnie skompilowanych, skalarnych funkcji zdefiniowanych przez użytkownika są wszystkimi parametrami obsługiwanymi dla natywnie skompilowanych procedur składowanych, o ile parametry są dozwolone dla funkcji zdefiniowanych przez użytkownika skalarnego. Przykładem obsługiwanego parametru jest parametr tabelaryczny.

Schema-Bound

Poniższe zasady dotyczą natywnie skompilowanych, skalarnych funkcji zdefiniowanych przez użytkownika.

  • Musi być powiązana schematem przy użyciu argumentu WITH SCHEMABINDING w funkcji CREATE i FUNKCJI ALTER.

  • Nie można usunąć ani zmienić, jeśli są odniesieniami do związanej ze schematem procedury składowanej lub funkcji zdefiniowanej przez użytkownika.

SHOWPLAN_XML

Natywnie skompilowane skalarne funkcje zdefiniowane przez użytkownika obsługują SHOWPLAN_XML. Jest on zgodny z ogólnym schematem SHOWPLAN_XML, podobnie jak w przypadku natywnie skompilowanych procedur składowanych. Podstawowym elementem funkcji zdefiniowanych przez użytkownika jest <UDF>.

KOD XML STATYSTYKI nie jest obsługiwany dla natywnie skompilowanych, skalarnych funkcji zdefiniowanych przez użytkownika. Po uruchomieniu zapytania odwołującego się do funkcji zdefiniowanej przez użytkownika z włączoną funkcją STATISTICS XML zawartość XML jest zwracana bez części funkcji zdefiniowanej przez użytkownika.

Permissions

Podobnie jak w przypadku natywnie skompilowanych procedur składowanych, uprawnienia do obiektów, do których odwołuje się natywnie skompilowana funkcja skalarna zdefiniowana przez użytkownika, są sprawdzane podczas tworzenia funkcji. Funkcja CREATE kończy się niepowodzeniem, jeśli personifikowany użytkownik nie ma odpowiednich uprawnień. Jeśli zmiany uprawnień spowodują, że personifikowany użytkownik nie ma już odpowiednich uprawnień, kolejne wykonania funkcji zdefiniowanej przez użytkownika kończą się niepowodzeniem.

W przypadku korzystania z natywnie skompilowanej, skalarnej funkcji zdefiniowanej przez użytkownika wewnątrz natywnie skompilowanej procedury składowanej uprawnienia do wykonywania funkcji zdefiniowanej przez użytkownika są sprawdzane podczas tworzenia procedury zewnętrznej. Jeśli użytkownik personifikowany przez procedurę zewnętrzną nie ma uprawnień EXEC dla funkcji zdefiniowanej przez użytkownika, tworzenie procedury składowanej kończy się niepowodzeniem. Jeśli zmiany uprawnień spowodują, że użytkownik nie ma już uprawnień EXEC, wykonanie procedury zewnętrznej zakończy się niepowodzeniem.

Zobacz też

Wbudowane funkcje (Transact-SQL)
zapisz plan wykonywania w formacie XML