Udostępnij za pomocą


UTWÓRZ FUNKCJĘ

Dotyczy:punkt końcowy analizy SQL i magazyn w usłudze Microsoft Fabric

CREATE FUNCTION umożliwia tworzenie wbudowanych funkcji tabel i funkcji skalarnych.

Uwaga / Notatka

Skalarne funkcje zdefiniowane przez użytkownika to funkcja w wersji zapoznawczej w magazynie danych sieci szkieletowej.

Ważne

W magazynie danych sieci szkieletowej funkcje zdefiniowane przez użytkownika muszą być wbudowane do użycia z zapytaniami SELECT ... FROM w tabelach użytkowników, ale nadal można tworzyć funkcje, które nie są wbudowane. Skalarne funkcje zdefiniowane przez użytkownika, które nie są wbudowane w ograniczonej liczbie scenariuszy. Możesz sprawdzić , czy można utworzyć wbudowane funkcje zdefiniowane przez użytkownika.

Funkcja zdefiniowana przez użytkownika jest procedurą Transact-SQL, która akceptuje parametry, wykonuje akcję, taką jak złożone obliczenia i zwraca wynik tej akcji jako wartość. Funkcje skalarne zwracają wartość skalarną, taką jak liczba lub ciąg. Funkcje tabeli zdefiniowane przez użytkownika (TVFs) zwracają tabelę.

Użyj CREATE FUNCTION polecenia , aby utworzyć procedurę języka T-SQL wielokrotnego użytku, która może być używana na następujące sposoby:

  • W Transact-SQL stwierdzeniach, takich jak SELECT
  • W Transact-SQL instrukcji manipulowania danymi (DML), takich jak UPDATE, INSERTi DELETE
  • W aplikacjach wywołujących funkcję
  • W definicji innej funkcji zdefiniowanej przez użytkownika
  • Aby zastąpić procedurę składowaną

Wskazówka

Można określić CREATE OR ALTER FUNCTION , aby utworzyć nową funkcję, jeśli ta funkcja nie istnieje według tej nazwy lub zmienić istniejącą funkcję w jednej instrukcji.

Transact-SQL konwencje składni

Składnia

Składnia funkcji skalarnych

CREATE FUNCTION [ schema_name. ] function_name   
( [ { @parameter_name [ AS ] parameter_data_type   
    [ = default ] }   
    [ ,...n ]  
  ]  
)  
RETURNS return_data_type  
    [ WITH <function_option> [ ,...n ] ]  
    [ AS ]  
    BEGIN   
        function_body   
        RETURN scalar_expression  
    END  
[ ; ]  

<function_option>::=   
{  
    [ SCHEMABINDING ]  
  | [ RETURNS NULL ON NULL INPUT | CALLED ON NULL INPUT ]  
}  

Składnia funkcji wbudowanych wartości tabeli

CREATE FUNCTION [ schema_name. ] function_name
( [ { @parameter_name [ AS ] parameter_data_type
    [ = default ] }
    [ ,...n ]
  ]
)
RETURNS TABLE
    [ WITH SCHEMABINDING ]
    [ AS ]
    RETURN [ ( ] select_stmt [ ) ]
[ ; ]

Argumenty (w programowaniu)

schema_name

Nazwa schematu, do którego należy funkcja zdefiniowana przez użytkownika.

function_name

Nazwa funkcji zdefiniowanej przez użytkownika. Nazwy funkcji muszą być zgodne z regułami identyfikatorów i muszą być unikatowe w bazie danych i jej schematu.

Uwaga / Notatka

Nawiasy są wymagane po nazwie funkcji, nawet jeśli parametr nie jest określony.

@ parameter_name

Parametr w funkcji zdefiniowanej przez użytkownika. Można zadeklarować jeden lub więcej parametrów.

Funkcja może mieć maksymalnie 2 100 parametrów. Wartość każdego zadeklarowanego parametru musi być podana przez użytkownika podczas wykonywania funkcji, chyba że zdefiniowano wartość domyślną dla parametru.

Określ nazwę parametru przy użyciu znaku (@) jako pierwszego znaku. Nazwa parametru musi być zgodna z regułami dotyczącymi identyfikatorów. Parametry są lokalne dla funkcji; Te same nazwy parametrów mogą być używane w innych funkcjach. Parametry mogą mieć miejsce tylko stałych; Nie można ich używać zamiast nazw tabel, nazw kolumn ani nazw innych obiektów bazy danych.

Uwaga / Notatka

ANSI_WARNINGS nie jest honorowany podczas przekazywania parametrów w procedurze składowanej, funkcji zdefiniowanej przez użytkownika lub podczas deklarowania i ustawiania zmiennych w instrukcji wsadowej. Jeśli na przykład zmienna jest zdefiniowana jako char(3), a następnie ustawiona na wartość większą niż trzy znaki, dane zostaną obcięte do zdefiniowanego rozmiaru, a instrukcja INSERT lub UPDATE zakończy się powodzeniem.

parameter_data_type

Typ danych parametru. W przypadku funkcji Transact-SQL dozwolone są wszystkie obsługiwane typy danych skalarnych .

[ = domyślnie ]

Wartość domyślna parametru. Jeśli zdefiniowano wartość domyślną , funkcja może zostać wykonana bez określania wartości dla tego parametru.

Jeśli parametr funkcji ma wartość domyślną, słowo DEFAULT kluczowe musi zostać określone, gdy funkcja jest wywoływana w celu pobrania wartości domyślnej. To zachowanie różni się od używania parametrów z wartościami domyślnymi w procedurach składowanych, w których pominięcie parametru również implikuje wartość domyślną.

return_data_type

Wartość zwracana przez skalarną funkcję zdefiniowaną przez użytkownika.

W przypadku funkcji w magazynie danych sieci szkieletowej wszystkie typy danych są dozwolone z wyjątkiem sygnatury czasowej rowversion/. Typy niepodobne, takie jak tabela , są niedozwolone.

function_body

Seria instrukcji Transact-SQL.

W funkcjach skalarnych function_body to seria instrukcji Transact-SQL, które razem oceniają wartość skalarną, która może obejmować:

  • Wyrażenie pojedynczej instrukcji
  • Wyrażenia z wieloma instrukcjami (IF/THEN/ELSE i BEGIN/END bloki)
  • Zmienne lokalne
  • Wywołania wbudowanych funkcji SQL dostępnych
  • Wywołania do innych funkcji zdefiniowanych przez użytkownika
  • SELECT instrukcje i odwołania do tabel, widoków i wbudowanych funkcji wartości tabeli

scalar_expression

Określa wartość skalarną zwracaną przez funkcję skalarną.

select_stmt

Pojedyncza SELECT instrukcja, która definiuje wartość zwracaną funkcji tabeli wbudowanej. W przypadku wbudowanej funkcji wartości tabeli nie ma treści funkcji; tabela jest zestawem wyników pojedynczej SELECT instrukcji.

TABELA

Określa, że wartością zwracaną przez funkcję zwracającą tabelę (TVF) jest tabela. Tylko stałe i @local_variables mogą być przekazywane do TVF.

W wbudowanych funkcjach TVFs (wersja zapoznawcza) zwracana wartość TABELI jest definiowana za pomocą pojedynczej SELECT instrukcji. Funkcje wbudowane nie mają skojarzonych zmiennych zwracanych.

<function_option>

W magazynie danych sieci szkieletowej słowa INLINEENCRYPTIONkluczowe , i EXECUTE AS nie są obsługiwane.

Obsługiwane opcje funkcji obejmują:

POWIĄZANIE SCHEMATU

Określa, że funkcja jest powiązana z obiektami bazy danych, do których się odwołuje. Po określeniu metody SCHEMABINDING nie można modyfikować obiektów podstawowych w sposób, który będzie miał wpływ na definicję funkcji. Sama definicja funkcji musi najpierw zostać zmodyfikowana lub usunięta, aby usunąć zależności od obiektu, który ma zostać zmodyfikowany.

Powiązanie funkcji z obiektami, do których się odwołuje, jest usuwane tylko wtedy, gdy występuje jedna z następujących akcji:

  • Funkcja zostanie porzucona.

  • Funkcja jest modyfikowana przy użyciu instrukcji ALTER z nieokreśloną opcją SCHEMABINDING.

Funkcja może być powiązana ze schematem tylko wtedy, gdy spełnione są następujące warunki:

  • Wszystkie funkcje zdefiniowane przez użytkownika, do których odwołuje się funkcja, również są powiązane schematem.

  • Obiekty, do których odwołuje się funkcja, są przywoływane przy użyciu nazwy dwuczęściowej.

  • W treści funkcji zdefiniowanych przez użytkownika można odwoływać się tylko do wbudowanych funkcji i innych funkcji zdefiniowanych przez użytkownika w tej samej bazie danych.

  • Użytkownik, który wykonał instrukcję CREATE FUNCTION , ma uprawnienie REFERENCES do obiektów bazy danych, do których odwołuje się funkcja.

Aby usunąć SCHEMATBINDING, użyj polecenia ALTER.

ZWRACA WARTOŚĆ NULL DLA DANYCH WEJŚCIOWYCH O WARTOŚCI NULL | WYWOŁYWANE PRZY DANYCH WEJŚCIOWYCH O WARTOŚCI NULL

Określa OnNULLCall atrybut funkcji wartości skalarnej. Jeśli nie zostanie określony, CALLED ON NULL INPUT jest domyślnie dorozumiany, a treść funkcji jest wykonywana nawet wtedy, gdy NULL jest przekazywana jako argument.

Najlepsze rozwiązania

  • Jeśli funkcja zdefiniowana przez użytkownika nie zostanie utworzona przy użyciu powiązania schematu, zmiany wprowadzone w obiektach bazowych mogą mieć wpływ na definicję funkcji i wygenerować nieoczekiwane wyniki podczas wywoływania. Zaleca się określenie klauzuli WITH SCHEMABINDING podczas tworzenia funkcji. Gwarantuje to, że obiekty, do których odwołuje się definicja funkcji, nie mogą być modyfikowane, chyba że funkcja zostanie również zmodyfikowana.

  • Pisanie funkcji zdefiniowanych przez użytkownika w celu pisania wbudowanych funkcji. Aby uzyskać więcej informacji, zobacz Scalar UDF inlining.

Współdziałanie

Wbudowane funkcje zdefiniowane przez użytkownika w tabeli

W wbudowanej funkcji z wartością tabeli dozwolona jest tylko pojedyncza instrukcja select.

Skalarne funkcje zdefiniowane przez użytkownika

  • Następujące instrukcje są prawidłowe w funkcji skalarnej wartości:

    • Instrukcje przypisania
    • Instrukcje control-of-Flow z wyjątkiem TRY...CATCH instrukcji
    • DECLARE instrukcje definiujące lokalne zmienne danych
  • Następujące wbudowane funkcje nie są obsługiwane w treści funkcji o wartości skalarnej:

  • Nie można używać skalarnych funkcji zdefiniowanych przez użytkownika w SELECT ... FROM zapytaniu w tabeli użytkownika, gdy:

  • Nie można używać scalarnych funkcji zdefiniowanych przez użytkownika w zapytaniu, gdy:

    • Funkcja UDF jest wywoływana bezpośrednio w klauzuli GROUP BY .
    • Funkcja UDF jest wywoływana bezpośrednio w klauzuli ORDER BY .
    • zapytanie wywołujące ma wspólne wyrażenie tabeli (CTE).
  • Cykliczne funkcje zdefiniowane przez użytkownika nie są obsługiwane.

  • Zapytanie użytkownika może zakończyć się niepowodzeniem, jeśli w jednym zapytaniu jest wykonanych więcej niż 10 wywołań UDF.

  • W niektórych przypadkach złożoność zapytania użytkownika i treści funkcji zdefiniowanej przez użytkownika uniemożliwia tworzenie w tekście, w takim przypadku skalarna funkcja zdefiniowanej przez użytkownika nie jest wzwierszona, a zapytanie użytkownika kończy się niepowodzeniem.

  • Gdy w dowolnym nieobsługiwanym scenariuszu jest używana skalarna funkcja zdefiniowanej przez użytkownika, zostanie wyświetlony komunikat o błędzie "Scalar UDF execution is currently unavailable in this context."

Ograniczenia

Uwaga / Notatka

W bieżącej wersji zapoznawczej ograniczenia mogą ulec zmianie.

Funkcji zdefiniowanych przez użytkownika nie można używać do wykonywania akcji modyfikujących stan bazy danych.

Funkcje zdefiniowane przez użytkownika można zagnieżdżać; oznacza to, że jedna funkcja zdefiniowana przez użytkownika może wywołać inną. Poziom zagnieżdżania jest zwiększany, gdy wywołana funkcja rozpoczyna swoje wykonanie, i zmniejszany po jego zakończeniu. Funkcje zdefiniowane przez użytkownika w magazynie danych sieci szkieletowej mogą być zagnieżdżone do czterech poziomów, gdy treść funkcji zdefiniowanej przez użytkownika odwołuje się do funkcji tabeli/widoku/tabeli w wierszu lub do 32 poziomów w przeciwnym razie. Przekroczenie maksymalnych poziomów zagnieżdżania powoduje niepowodzenie łańcucha funkcji wywołujących.

Metadane

W tej sekcji wymieniono widoki wykazu systemu, których można użyć do zwracania metadanych dotyczących funkcji zdefiniowanych przez użytkownika.

  • sys.sql_modules: wyświetla definicję funkcji zdefiniowanych przez użytkownika Transact-SQL. Przykład:

    SELECT definition, type   
    FROM sys.sql_modules AS m  
    JOIN sys.objects AS o   
        ON m.object_id = o.object_id   
        AND type = ('FN');
    
  • sys.parameters: wyświetla informacje o parametrach zdefiniowanych przez użytkownika.

  • sys.sql_expression_dependencies: wyświetla obiekty bazowe, do których odwołuje się funkcja.

Uprawnienia

Członkowie ról Administrator obszaru roboczego sieci szkieletowej, Członek i Współautor mogą tworzyć funkcje.

Scalar UDF inlining (Podkreślenie funkcji UDF skalarnych)

Usługa Microsoft Fabric Data Warehouse używa skalowania UDF inlining do kompilowania i wykonywania kodu zdefiniowanego przez użytkownika w sposób rozproszony. Domyślnie włączono tworzenie scalanych wbudowanych funkcji zdefiniowanej przez użytkownika.

Podczas gdy podkreślenie funkcji UDF skalarnej jest techniką optymalizacji wydajności po raz pierwszy wprowadzoną w programie Microsoft SQL Server 2019 (15.0), w magazynie danych sieci szkieletowej określa obsługiwany zestaw scenariuszy. W magazynie danych sieci szkieletowej funkcje zdefiniowane przez użytkownika są automatycznie przekształcane w wyrażenia skalarne lub podzapytania skalarne, które są zastępowane w zapytaniu wywołującym zamiast operatora UDF.

Niektóre składnie języka T-SQL sprawiają, że skalarna funkcja UDF jest nieliniowalna. Funkcje, które zawierają pętlę WHILE , wiele RETURN instrukcji lub wywołanie nieokreślonej wbudowanej funkcji SQL (takiej jak GETUTCDATE() lub GETDATE()) nie mogą być wbudowane. Aby uzyskać więcej informacji, zobacz Scalar UDF inlining requirements (Wymagania dotyczące tworzenia podkreślenia funkcji UDF skalarnych).

Sprawdzanie, czy można utworzyć wlinę skalarną funkcji zdefiniowanej przez użytkownika

sys.sql_modules Widok wykazu zawiera kolumnę , która wskazuje, czy funkcja zdefiniowanej przez is_inlineableużytkownika jest wbudowana.

Właściwość is_inlineable pochodzi z sprawdzania składni wewnątrz definicji funkcji zdefiniowanej przez użytkownika. Skalarna funkcja zdefiniowanej przez użytkownika nie jest wciśnięta przed czasem kompilacji. Wartość 1 wskazuje, że funkcja UDF jest wbudowana, a wartość 0 wskazuje, że nie jest ona wbudowana. Jeśli funkcja UDF skalarna jest wbudowana, nie gwarantuje, że będzie ona zawsze wzwierszona po skompilowaniu zapytania.

Magazyn danych sieci szkieletowej decyduje (na zapytanie), czy należy w tekście funkcji zdefiniowanej przez użytkownika, w zależności od ogólnej złożoności zapytań.

Użyj następującego przykładowego zapytania, aby sprawdzić, czy funkcja UDF skalarna jest wbudowana:

SELECT 
SCHEMA_NAME(b.schema_id) as function_schema_name,
    b.name as function_name,
       b.type_desc as function_type,
       a.is_inlineable
FROM sys.sql_modules AS a
     INNER JOIN sys.objects AS b
         ON a.object_id = b.object_id
WHERE b.type IN ('FN');

Jeśli funkcja skalarna nie jest wbudowana w sys.sql_modules.is_inlineableprogramie , nadal można wykonać zapytanie jako autonomiczne wywołanie, na przykład, aby ustawić zmienną. Jednak funkcja skalarna nie może być częścią SELECT ... FROM zapytania w tabeli użytkownika. Przykład:

CREATE FUNCTION [dbo].[custom_SYSUTCDATETIME]()
  RETURNS datetime2(6)
  AS
  BEGIN
   RETURN SYSUTCDATETIME();
  END

Przykładowa dbo.custom_SYSUTCDATETIME funkcja zdefiniowana przez użytkownika skalarna nie jest wbudowana ze względu na użycie nieokreślonej funkcji systemowej . SYSUTCDATETIME() Nie powiedzie się w przypadku użycia w SELECT ... FROM zapytaniu w tabeli użytkownika, ale powiedzie się jako autonomiczne wywołanie, na przykład:

DECLARE @utcdate datetime2(7);
SET @utcdate = dbo.custom_SYSUTCDATETIME();
SELECT @utcdate as 'utc_date';

Przykłady

Odp. Tworzenie wbudowanej funkcji z wartościami tabelarycznymi

W poniższym przykładzie zostanie utworzona wbudowana funkcja z wartością tabeli, aby zwrócić niektóre kluczowe informacje dotyczące modułów, filtrując według parametru objectType . Zawiera on wartość domyślną, która zwraca wszystkie moduły, gdy funkcja jest wywoływana z parametrem DEFAULT . W tym przykładzie użyto niektórych widoków wykazu systemu wymienionych w sekcji Metadane.

CREATE FUNCTION dbo.ModulesByType (@objectType CHAR(2) = '%%')
RETURNS TABLE
AS
RETURN (
        SELECT sm.object_id AS 'Object Id',
            o.create_date AS 'Date Created',
            OBJECT_NAME(sm.object_id) AS 'Name',
            o.type AS 'Type',
            o.type_desc AS 'Type Description',
            sm.DEFINITION AS 'Module Description',
            sm.is_inlineable AS 'Inlineable'
        FROM sys.sql_modules AS sm
        INNER JOIN sys.objects AS o ON sm.object_id = o.object_id
        WHERE o.type LIKE '%' + @objectType + '%'
        );
GO

Następnie można wywołać funkcję, aby zwrócić wszystkie wbudowane funkcje tabeli (IF) z:

SELECT * FROM dbo.ModulesByType('IF'); -- SQL_INLINE_TABLE_VALUED_FUNCTION

Lub znajdź wszystkie funkcje skalarne (FN):

SELECT * FROM dbo.ModulesByType('FN'); -- SQL_SCALAR_FUNCTION

B. Łączenie wyników wbudowanej funkcji o wartości tabeli

W tym prostym przykładzie użyto wcześniej utworzonego wbudowanego interfejsu TVF, aby zademonstrować, jak można połączyć wyniki z innymi tabelami przy użyciu krzyżowego zastosowania. W tym miejscu wybieramy wszystkie kolumny z obu sys.objects kolumn i wyniki ModulesByType dla wszystkich wierszy pasujących do kolumny type . Aby uzyskać więcej informacji na temat używania funkcji apply, zobacz KLAUZULA FROM oraz JOIN, APPLY, PIVOT (Transact-SQL).

SELECT * 
FROM sys.objects AS o
CROSS APPLY dbo.ModulesByType(o.type);
GO

C. Tworzenie funkcji UDF skalarnej

W poniższym przykładzie jest tworzona wbudowana funkcja UDF skalarna, która maskuje tekst wejściowy.

CREATE OR ALTER FUNCTION [dbo].[cleanInput] (@InputString VARCHAR(100))
    RETURNS VARCHAR(50)
    AS
    BEGIN
        DECLARE @Result VARCHAR(50)
        DECLARE @CleanedInput VARCHAR(50)

        -- Trim whitespace
        SET @CleanedInput = LTRIM(RTRIM(@InputString))

        -- Handle empty or null input
        IF @CleanedInput = '' OR @CleanedInput IS NULL
        BEGIN
            SET @Result = ''
        END
        ELSE IF LEN(@CleanedInput) <= 2
        BEGIN
            -- If string length is 1 or 2, just return the cleaned string
            SET @Result = @CleanedInput
        END
        ELSE
        BEGIN
            -- Construct the masked string
            SET @Result = 
                LEFT(@CleanedInput, 1) +
                REPLICATE('*', LEN(@CleanedInput) - 2) +
                RIGHT(@CleanedInput, 1)
        END

        RETURN @Result
    END

Możesz wywołać funkcję w następujący sposób:

DECLARE @input varchar(100) = '123456789'

SELECT dbo.cleanInput (@input) AS function_output;

Więcej przykładów użycia skalarnych funkcji zdefiniowanych przez użytkownika w usłudze Fabric Data Warehouse:

W instrukcji SELECT :

SELECT TOP 10 
t.id, t.name, 
dbo.cleanInput (t.name) AS function_output
FROM dbo.MyTable AS t;

W klauzuli WHERE :

 SELECT t.id, t.name, dbo.cleanInput(t.name) AS function_output
FROM dbo.MyTable AS t
WHERE dbo.cleanInput(t.name)='myvalue'

W klauzuli JOIN :

SELECT t1.id, t1.name, 
     dbo.cleanInput (t1.name) AS function_output, 
     dbo.cleanInput (t2.name) AS function_output_2
FROM dbo.MyTable1 AS t1
    INNER JOIN dbo.MyTable2 AS t2 
        ON dbo.cleanInput(t1.name)=dbo.cleanInput(t2.name);

W klauzuli ORDER BY :

SELECT  t.id, t.name, dbo.cleanInput (t.name) AS function_output
FROM dbo.MyTable AS t
ORDER BY function_output;

W instrukcjach języka manipulowania danymi (DML), takich jak INSERT, UPDATElub DELETE:

SELECT t.id, t.name, dbo.cleanInput (t.name) AS function_output 
INTO dbo.MyTable_new
FROM dbo.MyTable AS t;

UPDATE t
SET t.mycolumn_new = dbo.cleanInput (t.name)
FROM dbo.MyTable AS t;

DELETE t
FROM dbo.MyTable AS t
WHERE dbo.cleanInput (t.name) ='myvalue';

Dotyczy:azure Synapse AnalyticsAnalytics Platform System (PDW)

Tworzy funkcję zdefiniowaną przez użytkownika (UDF) w usłudze Azure Synapse Analytics lub Analytics Platform System (PDW). Funkcja zdefiniowana przez użytkownika jest procedurą Transact-SQL, która akceptuje parametry, wykonuje akcję, taką jak złożone obliczenia i zwraca wynik tej akcji jako wartość. Funkcje tabeli zdefiniowane przez użytkownika (TVFS) zwracają typ danych tabeli.

Wskazówka

Składnia w Fabric Data Warehouse znajduje się w wersji CREATE FUNCTION dla Fabric Data Warehouse.

  • W systemie Platform Platform Analytics (PDW) wartość zwracana musi być wartością skalarną (pojedynczą).

  • W usłudze Azure Synapse Analytics CREATE FUNCTION można zwrócić tabelę przy użyciu składni dla wbudowanych funkcji wartości tabeli (wersja zapoznawcza) lub może zwrócić pojedynczą wartość przy użyciu składni dla funkcji skalarnych.

  • W bezserwerowych pulach SQL w usłudze Azure Synapse Analytics można tworzyć wbudowane funkcje wartości tabeli, CREATE FUNCTION ale nie funkcje skalarne.

    Użyj tej instrukcji, aby utworzyć rutynę wielokrotnego użytku, której można używać w następujący sposób:

  • W Transact-SQL stwierdzeniach, takich jak SELECT

  • W aplikacjach wywołujących funkcję

  • W definicji innej funkcji zdefiniowanej przez użytkownika

  • Aby zdefiniować ograniczenie CHECK w kolumnie

  • Aby zastąpić procedurę składowaną

  • Używanie funkcji wbudowanej jako predykatu filtru dla zasad zabezpieczeń

Transact-SQL konwencje składni

Składnia

Składnia funkcji skalarnych

-- Transact-SQL Scalar Function Syntax (in dedicated pools in Azure Synapse Analytics and Parallel Data Warehouse)
-- Not available in the serverless SQL pools in Azure Synapse Analytics

CREATE FUNCTION [ schema_name. ] function_name   
( [ { @parameter_name [ AS ] parameter_data_type   
    [ = default ] }   
    [ ,...n ]  
  ]  
)  
RETURNS return_data_type  
    [ WITH <function_option> [ ,...n ] ]  
    [ AS ]  
    BEGIN   
        function_body   
        RETURN scalar_expression  
    END  
[ ; ]  

<function_option>::=   
{  
    [ SCHEMABINDING ]  
  | [ RETURNS NULL ON NULL INPUT | CALLED ON NULL INPUT ]  
}  

Składnia funkcji wbudowanych wartości tabeli

-- Transact-SQL Inline Table-Valued Function Syntax
-- Preview in dedicated SQL pools in Azure Synapse Analytics
-- Available in the serverless SQL pools in Azure Synapse Analytics
CREATE FUNCTION [ schema_name. ] function_name
( [ { @parameter_name [ AS ] parameter_data_type
    [ = default ] }
    [ ,...n ]
  ]
)
RETURNS TABLE
    [ WITH SCHEMABINDING ]
    [ AS ]
    RETURN [ ( ] select_stmt [ ) ]
[ ; ]

Argumenty (w programowaniu)

schema_name

Nazwa schematu, do którego należy funkcja zdefiniowana przez użytkownika.

function_name

Nazwa funkcji zdefiniowanej przez użytkownika. Nazwy funkcji muszą być zgodne z regułami identyfikatorów i muszą być unikatowe w bazie danych i jej schematu.

Uwaga / Notatka

Nawiasy są wymagane po nazwie funkcji, nawet jeśli parametr nie jest określony.

@ parameter_name

Parametr w funkcji zdefiniowanej przez użytkownika. Można zadeklarować jeden lub więcej parametrów.

Funkcja może mieć maksymalnie 2 100 parametrów. Wartość każdego zadeklarowanego parametru musi być podana przez użytkownika podczas wykonywania funkcji, chyba że zdefiniowano wartość domyślną dla parametru.

Określ nazwę parametru przy użyciu znaku (@) jako pierwszego znaku. Nazwa parametru musi być zgodna z regułami dotyczącymi identyfikatorów. Parametry są lokalne dla funkcji; Te same nazwy parametrów mogą być używane w innych funkcjach. Parametry mogą mieć miejsce tylko stałych; Nie można ich używać zamiast nazw tabel, nazw kolumn ani nazw innych obiektów bazy danych.

Uwaga / Notatka

ANSI_WARNINGS nie jest honorowany podczas przekazywania parametrów w procedurze składowanej, funkcji zdefiniowanej przez użytkownika lub podczas deklarowania i ustawiania zmiennych w instrukcji wsadowej. Jeśli na przykład zmienna jest zdefiniowana jako char(3), a następnie ustawiona na wartość większą niż trzy znaki, dane zostaną obcięte do zdefiniowanego rozmiaru, a instrukcja INSERT lub UPDATE zakończy się powodzeniem.

parameter_data_type

Typ danych parametru. W przypadku funkcji Transact-SQL dozwolone są wszystkie typy danych skalarnych obsługiwane w usłudze Azure Synapse Analytics. Typ danych sygnatury czasowej (rowversion) nie jest obsługiwanym typem.

[ = domyślnie ]

Wartość domyślna parametru. Jeśli zdefiniowano wartość domyślną , funkcja może zostać wykonana bez określania wartości dla tego parametru.

Jeśli parametr funkcji ma wartość domyślną, słowo kluczowe DEFAULT musi być określone, gdy funkcja jest wywoływana, aby pobrać wartość domyślną. To zachowanie różni się od używania parametrów z wartościami domyślnymi w procedurach składowanych, w których pominięcie parametru również implikuje wartość domyślną.

return_data_type

Wartość zwracana przez skalarną funkcję zdefiniowaną przez użytkownika. W przypadku funkcji Transact-SQL dozwolone są wszystkie typy danych skalarnych obsługiwane w usłudze Azure Synapse Analytics. Typ danych sygnatury czasowej rowversion/ nie jest obsługiwanym typem. Typy nienależące do kursora i tabeli nie są dozwolone.

function_body

Seria instrukcji Transact-SQL. Function_body nie może zawierać SELECT instrukcji i nie może odwoływać się do danych bazy danych. Function_body nie może odwoływać się do tabel ani widoków. Treść funkcji może wywoływać inne funkcje deterministyczne, ale nie może wywoływać funkcji nieokreślonych.

W funkcjach skalarnych function_body jest serią Transact-SQL instrukcji, które razem dają w wyniku wartość skalarną.

scalar_expression

Określa wartość skalarną zwracaną przez funkcję skalarną.

select_stmt

Pojedyncza SELECT instrukcja, która definiuje wartość zwracaną funkcji tabeli wbudowanej. W przypadku wbudowanej funkcji wartości tabeli nie ma treści funkcji; tabela jest zestawem wyników pojedynczej SELECT instrukcji.

TABELA

Określa, że wartością zwracaną przez funkcję zwracającą tabelę (TVF) jest tabela. Tylko stałe i @local_variables mogą być przekazywane do TVF.

W wbudowanych funkcjach TVFs (wersja zapoznawcza) zwracana wartość TABELI jest definiowana za pomocą pojedynczej SELECT instrukcji. Funkcje wbudowane nie mają skojarzonych zmiennych zwracanych.

<function_option>

Określa, że funkcja ma co najmniej jedną z następujących opcji.

POWIĄZANIE SCHEMATU

Określa, że funkcja jest powiązana z obiektami bazy danych, do których się odwołuje. Po określeniu metody SCHEMABINDING nie można modyfikować obiektów podstawowych w sposób, który będzie miał wpływ na definicję funkcji. Sama definicja funkcji musi najpierw zostać zmodyfikowana lub usunięta, aby usunąć zależności od obiektu, który ma zostać zmodyfikowany.

Powiązanie funkcji z obiektami, do których się odwołuje, jest usuwane tylko wtedy, gdy występuje jedna z następujących akcji:

  • Funkcja zostanie porzucona.

  • Funkcja jest modyfikowana przy użyciu instrukcji ALTER z nieokreśloną opcją SCHEMABINDING.

Funkcja może być powiązana ze schematem tylko wtedy, gdy spełnione są następujące warunki:

  • Wszystkie funkcje zdefiniowane przez użytkownika, do których odwołuje się funkcja, również są powiązane schematem.

  • Do funkcji i innych funkcji zdefiniowanych przez funkcję odwołuje się jednoczęściowa lub dwuczęściowa nazwa.

  • W treści funkcji zdefiniowanych przez użytkownika można odwoływać się tylko do wbudowanych funkcji i innych funkcji zdefiniowanych przez użytkownika w tej samej bazie danych.

  • Użytkownik, który wykonał instrukcję CREATE FUNCTION , ma uprawnienie REFERENCES do obiektów bazy danych, do których odwołuje się funkcja.

Aby usunąć SCHEMATBINDING, użyj polecenia ALTER.

ZWRACA WARTOŚĆ NULL DLA DANYCH WEJŚCIOWYCH O WARTOŚCI NULL | WYWOŁYWANE PRZY DANYCH WEJŚCIOWYCH O WARTOŚCI NULL

Określa OnNULLCall atrybut funkcji wartości skalarnej. Jeśli nie zostanie określony, CALLED ON NULL INPUT jest domyślnie dorozumiany, a treść funkcji jest wykonywana nawet wtedy, gdy NULL jest przekazywana jako argument.

Najlepsze rozwiązania

Jeśli funkcja zdefiniowana przez użytkownika nie zostanie utworzona za pomocą klauzuli SCHEMABINDING, zmiany wprowadzone w obiektach bazowych mogą mieć wpływ na definicję funkcji i spowodować nieoczekiwane wyniki po wywołaniu. Zaleca się określenie klauzuli WITH SCHEMABINDING podczas tworzenia funkcji. Gwarantuje to, że obiekty, do których odwołuje się definicja funkcji, nie mogą być modyfikowane, chyba że funkcja zostanie również zmodyfikowana.

Współdziałanie

Następujące instrukcje są prawidłowe w funkcji skalarnej wartości:

  • Instrukcje przypisania.

  • Instrukcje control-of-Flow z wyjątkiem TRY... Instrukcje CATCH.

  • Instrukcje DECLARE definiujące lokalne zmienne danych.

W wbudowanej funkcji wartości tabeli (wersja zapoznawcza) dozwolona jest tylko jedna instrukcja select.

Ograniczenia

Funkcji zdefiniowanych przez użytkownika nie można używać do wykonywania akcji modyfikujących stan bazy danych.

Funkcje zdefiniowane przez użytkownika można zagnieżdżać; oznacza to, że jedna funkcja zdefiniowana przez użytkownika może wywołać inną. Poziom zagnieżdżania jest zwiększany, gdy wywołana funkcja rozpoczyna swoje wykonanie, i zmniejszany po jego zakończeniu. Przekroczenie maksymalnych poziomów zagnieżdżania powoduje niepowodzenie całego łańcucha funkcji wywołujących.

Obiektów, w tym funkcji, nie można utworzyć w master bazie danych bezserwerowej puli SQL w usłudze Azure Synapse Analytics.

Metadane

W tej sekcji wymieniono widoki wykazu systemu, których można użyć do zwracania metadanych dotyczących funkcji zdefiniowanych przez użytkownika.

  • sys.sql_modules: wyświetla definicję funkcji zdefiniowanych przez użytkownika Transact-SQL. Przykład:

    SELECT definition, type   
    FROM sys.sql_modules AS m  
    JOIN sys.objects AS o   
        ON m.object_id = o.object_id   
        AND type = ('FN');
    
  • sys.parameters: wyświetla informacje o parametrach zdefiniowanych przez użytkownika.

  • sys.sql_expression_dependencies: wyświetla obiekty bazowe, do których odwołuje się funkcja.

Uprawnienia

Wymaga uprawnienia CREATE FUNCTION w bazie danych i uprawnienia ALTER w schemacie, w którym jest tworzona funkcja.

Przykłady

Odp. Zmiana typu danych przy użyciu funkcji zdefiniowanej przez użytkownika o wartości skalarnej

Ta prosta funkcja przyjmuje typ danych int jako dane wejściowe i zwraca typ danych dziesiętnych (10,2) jako dane wyjściowe.

CREATE FUNCTION dbo.ConvertInput (@MyValueIn int)  
RETURNS decimal(10,2)  
AS  
BEGIN
    DECLARE @MyValueOut int;  
    SET @MyValueOut= CAST( @MyValueIn AS decimal(10,2));  
    RETURN(@MyValueOut);  
END;  
GO  

SELECT dbo.ConvertInput(15) AS 'ConvertedValue';  

Uwaga / Notatka

Funkcje skalarne nie są dostępne w bezserwerowych pulach SQL.

B. Tworzenie wbudowanej funkcji z wartościami tabelarycznymi

W poniższym przykładzie zostanie utworzona wbudowana funkcja z wartością tabeli, aby zwrócić niektóre kluczowe informacje dotyczące modułów, filtrując według parametru objectType . Zawiera on wartość domyślną, która zwraca wszystkie moduły, gdy funkcja jest wywoływana z parametrem DEFAULT . W tym przykładzie użyto niektórych widoków wykazu systemu wymienionych w sekcji Metadane.

CREATE FUNCTION dbo.ModulesByType(@objectType CHAR(2) = '%%')
RETURNS TABLE
AS
RETURN
(
    SELECT 
        sm.object_id AS 'Object Id',
        o.create_date AS 'Date Created',
        OBJECT_NAME(sm.object_id) AS 'Name',
        o.type AS 'Type',
        o.type_desc AS 'Type Description', 
        sm.definition AS 'Module Description'
    FROM sys.sql_modules AS sm  
    JOIN sys.objects AS o ON sm.object_id = o.object_id
    WHERE o.type like '%' + @objectType + '%'
);
GO

Następnie można wywołać funkcję, aby zwrócić wszystkie obiekty widoku (V) z:

select * from dbo.ModulesByType('V');

Uwaga / Notatka

Wbudowane funkcje tabeli-wartość są dostępne w bezserwerowych pulach SQL, ale w wersji zapoznawczej w dedykowanych pulach SQL.

C. Łączenie wyników wbudowanej funkcji o wartości tabeli

W tym prostym przykładzie użyto wcześniej utworzonego wbudowanego interfejsu TVF, aby zademonstrować, jak można połączyć wyniki z innymi tabelami przy użyciu krzyżowego zastosowania. W tym miejscu wybieramy wszystkie kolumny z obu sys.objects kolumn i wyniki ModulesByType dla wszystkich wierszy pasujących do kolumny type . Aby uzyskać więcej informacji na temat używania funkcji apply, zobacz KLAUZULA FROM oraz JOIN, APPLY, PIVOT (Transact-SQL).

SELECT * 
FROM sys.objects o
CROSS APPLY dbo.ModulesByType(o.type);
GO

Uwaga / Notatka

Wbudowane funkcje tabeli-wartość są dostępne w bezserwerowych pulach SQL, ale w wersji zapoznawczej w dedykowanych pulach SQL.

Następny krok