Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Dotyczy:SQL Server
Azure SQL Database
Azure 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
Za pomocą CREATE FUNCTION tworzysz natywnie kompilowaną, skalarną funkcję zdefiniowaną przez użytkownika, za pomocą DROP FUNCTION usuwasz funkcję zdefiniowaną przez użytkownika, a za pomocą ALTER FUNCTION modyfikujesz tę funkcję. 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.
-
Składnia DROP FUNCTION natywnie skompilowanych, skalarnych funkcji zdefiniowanych przez użytkownika jest taka sama jak w przypadku interpretowanych funkcji zdefiniowanych przez użytkownika.
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 Klauzula (Transact-SQL). EXECUTE AS CALLER nie jest obsługiwany. 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 skalarnych funkcji użytkownika, wskazówki zapytań dołączone do zapytania Transact-SQL, które odwołują się do natywnie skompilowanej, skalarnej funkcji użytkownika, nie wpływają na plan zapytań dla tej funkcji 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 argumentach CREATE FUNCTION i ALTER FUNCTION.
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 ze schematem ogólnym SHOWPLAN_XML , podobnie jak w przypadku natywnie skompilowanych procedur składowanych. Podstawowym elementem funkcji zdefiniowanych przez użytkownika jest <UDF>.
STATISTICS XML nie jest obsługiwana w przypadku natywnie skompilowanych, skalarnych funkcji zdefiniowanych przez użytkownika. Po wykonaniu zapytania odwołującego się do funkcji zdefiniowanej przez użytkownika, przy włączonej opcji STATISTICS XML, zawartość XML jest zwracana bez części dotyczącej 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. CREATE FUNCTION kończy się niepowodzeniem, jeśli użytkownik, pod którego się podszyto, nie ma wymaganych 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.