Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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,INSERTiDELETE - 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/ELSEiBEGIN/ENDbloki) - Zmienne lokalne
- Wywołania wbudowanych funkcji SQL dostępnych
- Wywołania do innych funkcji zdefiniowanych przez użytkownika
-
SELECTinstrukcje 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 SCHEMABINDINGpodczas 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...CATCHinstrukcji -
DECLAREinstrukcje 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 ... FROMzapytaniu w tabeli użytkownika, gdy:- Treść funkcji zdefiniowanej przez użytkownika zawiera wywołanie wbudowanej funkcji nieokreślonej. Zobacz Funkcje deterministyczne i niedeterministyczne.
- Treść funkcji zdefiniowanej przez użytkownika zawiera wspólne wyrażenie tabeli (CTE).
- Treść funkcji zdefiniowanej przez użytkownika zawiera treść funkcji UDF z wieloma instrukcjami poza sześcioma
IF-THEN-ELSEblokami. - Treść funkcji zdefiniowanej przez użytkownika zawiera pętlę WHILE
- Nie można podlinkować treści funkcji zdefiniowanej przez użytkownika z innych powodów. Aby uzyskać więcej informacji, zobacz Scalar UDF inlining requirements (Wymagania dotyczące tworzenia podkreślenia funkcji UDF skalarnych).
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).
- Funkcja UDF jest wywoływana bezpośrednio w klauzuli
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';
Treści powiązane
Dotyczy:azure Synapse Analytics
Analytics 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 FUNCTIONmoż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 FUNCTIONale 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
SELECTW 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.