Udostępnij za pośrednictwem


Funkcje zdefiniowane przez użytkownika

Dotyczy:programu SQL ServerAzure SQL Databaseazure SQL Managed Instancepunktu końcowego analizy SQL w usłudze Microsoft FabricWarehouse w usłudze Microsoft Fabric

Podobnie jak funkcje w językach programowania, funkcje zdefiniowane przez użytkownika programu SQL Server to procedury, które akceptują parametry, wykonują akcję, taką jak złożone obliczenia i zwracają wynik tej akcji jako wartość. Wartość zwracana może być pojedynczą wartością skalarną lub zestawem wyników.

Zalety funkcji zdefiniowanych przez użytkownika

Dlaczego warto używać funkcji zdefiniowanych przez użytkownika (UDF)?

  • Programowanie modułowe. Funkcję można utworzyć raz, zapisać ją w bazie danych i wywołać ją dowolną liczbę razy w programie. Funkcje zdefiniowane przez użytkownika można modyfikować niezależnie od kodu źródłowego programu.

  • Szybsze realizowanie Podobnie jak w przypadku procedur składowanych, Transact-SQL funkcje zdefiniowane przez użytkownika zmniejszają koszt kompilacji Transact-SQL kodu, buforując plany i ponownie używając ich do powtarzających się wykonań. Oznacza to, że funkcja zdefiniowana przez użytkownika nie musi być raz za razem ponownie analizowana i optymalizowana przy każdym użyciu, co skutkuje szybszymi czasami wykonania.

    Funkcje środowiska uruchomieniowego języka wspólnego (CLR) oferują znaczącą przewagę wydajnościową nad funkcjami Transact-SQL w zadaniach obliczeniowych, manipulacji ciągami oraz logice biznesowej. Transact-SQL funkcje lepiej nadają się do logiki intensywnie korzystającej z dostępu do danych.

  • Zmniejsz ruch sieciowy. Operacja, która filtruje dane na podstawie pewnych złożonych ograniczeń, których nie można wyrazić w pojedynczym wyrażeniu skalarnym, może być wyrażona jako funkcja. Następnie można wywołać funkcję w klauzuli WHERE, aby zmniejszyć liczbę wierszy wysyłanych do klienta.

Ważne

Transact-SQL Funkcje zdefiniowane przez użytkownika (UDF) w zapytaniach można wykonywać tylko na jednym wątku (plan wykonania sekwencyjny). W związku z tym używanie UDF (funkcji zdefiniowanych przez użytkownika) hamuje równoległe przetwarzanie zapytań. Aby uzyskać więcej informacji na temat przetwarzania równoległego zapytań, zobacz Przewodnik po architekturze przetwarzania zapytań.

Typy funkcji

W tej sekcji opisano różnice między funkcjami skalarnym, funkcjami wartości tabeli i funkcjami systemowymi.

Funkcje skalarne

Funkcje skalarne zdefiniowane przez użytkownika zwracają pojedynczą wartość danych typu zdefiniowanego w klauzuli RETURN. W przypadku wbudowanej funkcji skalarnej zwracana wartość skalarna jest wynikiem pojedynczej instrukcji. W przypadku wielostanowej funkcji skalarnej treść funkcji może zawierać serię instrukcji Transact-SQL, które zwracają pojedynczą wartość. Zwracany typ może być dowolnym typem danych, z wyjątkiem tekstu, ntextu, obrazu, kursora i znacznika czasu. Aby zapoznać się z przykładami, zobacz Tworzenie funkcji zdefiniowanych przez użytkownika (aparat bazy danych).

Funkcje zwracające tabelę

Funkcje tabeli zdefiniowane przez użytkownika (TVF) zwracają typ danych tabela. W przypadku wbudowanej funkcji zwracającej wartości tabeli nie ma treści funkcji; tabela jest zestawem wyników pojedynczej instrukcji SELECT. Aby zapoznać się z przykładami, zobacz Tworzenie funkcji zdefiniowanych przez użytkownika (aparat bazy danych).

Funkcje systemowe

Program SQL Server udostępnia wiele funkcji systemowych, których można użyć do wykonywania różnych operacji. Nie można ich modyfikować. Aby uzyskać więcej informacji, zobacz Co to są funkcje bazy danych SQL?, Funkcje systemowe według kategorii dla języka Transact-SQL i Dynamiczne widoki zarządzania systemu.

Wytyczne

Transact-SQL błędy, które powodują anulowanie instrukcji i kontynuują następną instrukcję w module (na przykład wyzwalacze lub procedury składowane), są traktowane inaczej wewnątrz funkcji. W funkcjach takie błędy powodują zatrzymanie wykonywania funkcji. To z kolei powoduje anulowanie instrukcji, która wywołała funkcję.

Instrukcje w BEGIN...END bloku nie mogą mieć żadnych skutków ubocznych. Skutki uboczne funkcji to wszelkie trwałe zmiany stanu zasobu, który ma zakres poza funkcją, na przykład modyfikację tabeli bazy danych. Jedynymi zmianami, które instrukcje w funkcji mogą wprowadzać, są zmiany w obiektach lokalnych w funkcji, takich jak lokalne kursory lub zmienne. Modyfikacje tabel bazy danych, operacje na kursorach, które nie są lokalne w funkcji, takie jak wysyłanie wiadomości e-mail, próba modyfikacji wykazu i generowanie zestawu wyników zwróconego użytkownikowi, są przykładami akcji, których nie można wykonać w funkcji.

CREATE FUNCTION Jeżeli instrukcja generuje efekty uboczne dla zasobów, które nie istnieją, kiedy wydana zostanie CREATE FUNCTION instrukcja, program SQL Server wykonuje instrukcję. Jednak program SQL Server nie wykonuje funkcji po wywołaniu.

Liczba wykonań funkcji określonej w zapytaniu może się różnić między planami wykonywania utworzonymi przez optymalizator. Przykładem jest funkcja wywoływana przez podzapytywanie w klauzuli WHERE . Liczba wykonań podzapytania i jej funkcji może się różnić w zależności od różnych ścieżek dostępu wybranych przez optymalizator.

Funkcje deterministyczne muszą być powiązane ze schematem. Użyj klauzuli SCHEMABINDING podczas tworzenia funkcji deterministycznej.

Aby uzyskać więcej informacji i zagadnień dotyczących wydajności funkcji zdefiniowanych przez użytkownika, zobacz Tworzenie funkcji zdefiniowanych przez użytkownika (aparat bazy danych).

Prawidłowe instrukcje w funkcji

Typy instrukcji, które są prawidłowe w funkcji, obejmują:

  • DECLARE instrukcje mogą służyć do definiowania zmiennych danych i kursorów lokalnych dla funkcji.

  • Przypisania wartości do obiektów lokalnych do funkcji, takie jak używanie SET do przypisywania wartości do zmiennych lokalnych skalarnych i tabel.

  • Operacje kursora, które odnoszą się do lokalnych kursorów zadeklarowanych, otwartych, zamkniętych i zwolnionych w funkcji. FETCH instrukcje zwracające dane do klienta nie są dozwolone. Dozwolone są tylko FETCH instrukcje, które przypisują wartości do zmiennych lokalnych przy użyciu klauzuli INTO .

  • Instrukcje sterowania przepływem z wyjątkiem TRY...CATCH instrukcji.

  • SELECT instrukcje zawierające listy select z wyrażeniami, które przypisują wartości do zmiennych, które są lokalne dla funkcji.

  • UPDATE, INSERTi DELETE instrukcje modyfikujące zmienne tabeli, które są lokalne dla funkcji.

  • EXECUTE instrukcje wywołujące rozszerzoną procedurę przechowywaną.

Wbudowane funkcje systemowe

Następujące nieokreślone wbudowane funkcje mogą być używane w funkcjach zdefiniowanych przez użytkownika Transact-SQL.

  • CURRENT_TIMESTAMP
  • GET_TRANSMISSION_STATUS
  • GETDATE
  • GETUTCDATE
  • @@CONNECTIONS
  • @@CPU_BUSY
  • @@DBTS
  • @@IDLE
  • @@IO_BUSY
  • @@MAX_CONNECTIONS
  • @@PACK_RECEIVED
  • @@PACK_SENT
  • @@PACKET_ERRORS
  • @@TIMETICKS
  • @@TOTAL_ERRORS
  • @@TOTAL_READ
  • @@TOTAL_WRITE

Następujące nieokreślone wbudowane funkcje nie mogą być używane w funkcji zdefiniowanej przez użytkownika (UDF) Transact-SQL.

  • NEWID
  • NEWSEQUENTIALID
  • RAND
  • TEXTPTR

Jeśli odwołujesz się do jednej z tych funkcji wewnątrz UDF, wystąpi następujący błąd:

Msg 443, Level 16, State 1
Invalid use of a side-effecting operator <operator> within a function.

Aby uzyskać listę deterministycznych i niedeterministycznych wbudowanych funkcji systemowych, zobacz Funkcje deterministyczne i niedeterministyczne.

Funkcje powiązane ze schematem

CREATE FUNCTION Obsługuje klauzulę SCHEMABINDING , która wiąże funkcję ze schematem wszystkich obiektów, do których się odwołuje, takich jak tabele, widoki i inne funkcje zdefiniowane przez użytkownika. Próba zmiany lub porzucenia dowolnego obiektu, do którego odwołuje się funkcja powiązana schematu, kończy się niepowodzeniem.

Zanim będziesz mógł określić SCHEMABINDING w CREATE FUNCTION, należy spełnić te warunki:

  • Wszystkie widoki i funkcje zdefiniowane przez użytkownika, do których odwołuje się funkcja, muszą być powiązane ze schematem.

  • Wszystkie obiekty, do których odwołuje się funkcja, muszą znajdować się w tej samej bazie danych co funkcja. Do obiektów należy odwoływać się przy użyciu jednoczęściowych lub dwuczęściowych nazw.

  • Musisz mieć REFERENCES uprawnienia do wszystkich obiektów (tabel, widoków i funkcji zdefiniowanych przez użytkownika) w funkcji.

Możesz użyć ALTER FUNCTION polecenia , aby usunąć powiązanie schematu. Instrukcja ALTER FUNCTION powinna ponownie zdefiniować funkcję bez określania WITH SCHEMABINDING.

Określanie parametrów

Funkcja zdefiniowana przez użytkownika przyjmuje zero lub więcej parametrów wejściowych i zwraca wartość skalarną lub tabelę. Funkcja może mieć maksymalnie 1024 parametry wejściowe. Jeśli parametr funkcji ma wartość domyślną, słowo kluczowe DEFAULT musi zostać określone podczas wywoływania funkcji, aby uzyskać wartość domyślną. To zachowanie różni się od parametrów z wartościami domyślnymi w procedurach składowanych zdefiniowanych przez użytkownika, w których pominięcie parametru oznacza również wartość domyślną. Funkcje zdefiniowane przez użytkownika nie obsługują parametrów wyjściowych.