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:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Baza danych SQL w usłudze Microsoft Fabric
Tworzy funkcję zdefiniowaną przez użytkownika (UDF), która jest procedurą środowiska uruchomieniowego języka wspólnego (CLR) Transact-SQL. Funkcja zdefiniowana przez użytkownika akceptuje parametry, wykonuje akcję, taką jak złożone obliczenia, i zwraca wynik tej akcji jako wartość. Zwracana wartość może być wartością skalarną (pojedynczą) lub 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 aplikacjach, które wywołują funkcję
- W definicji innej funkcji zdefiniowanej przez użytkownika
- Aby sparametryzować widok lub poprawić funkcjonalność widoku indeksowanego
- Aby zdefiniować kolumnę w tabeli
- Aby zdefiniować ograniczenie dla kolumny
CHECK - Aby zastąpić procedurę składowaną
- Używanie funkcji wbudowanej jako predykatu filtru dla zasad zabezpieczeń
W tym artykule omówiono integrację środowiska .NET Framework CLR z programem SQL Server. Integracja z CLR nie ma zastosowania do Azure SQL Database.
Note
W przypadku usługi Microsoft Fabric Data Warehouse lub Azure Synapse Analytics zobacz CREATE FUNCTION (Azure Synapse Analytics i Microsoft Fabric).
Tip
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
Syntax
Składnia dla Transact-SQL funkcji skalarnych.
CREATE [ OR ALTER ] FUNCTION [ schema_name. ] function_name
( [ { @parameter_name [ AS ] [ type_schema_name. ] parameter_data_type [ NULL ]
[ = default ] [ READONLY ] }
[ , ...n ]
]
)
RETURNS return_data_type
[ WITH <function_option> [ , ...n ] ]
[ AS ]
BEGIN
function_body
RETURN scalar_expression
END
[ ; ]
Składnia Transact-SQL wbudowanych funkcji z wartościami tabeli.
CREATE [ OR ALTER ] FUNCTION [ schema_name. ] function_name
( [ { @parameter_name [ AS ] [ type_schema_name. ] parameter_data_type [ NULL ]
[ = default ] [ READONLY ] }
[ , ...n ]
]
)
RETURNS TABLE
[ WITH <function_option> [ , ...n ] ]
[ AS ]
RETURN [ ( ] select_stmt [ ) ]
[ ; ]
Składnia funkcji Transact-SQL wieloinstrukcyjnych funkcji zwracających tabelę.
CREATE [ OR ALTER ] FUNCTION [ schema_name. ] function_name
( [ { @parameter_name [ AS ] [ type_schema_name. ] parameter_data_type [ NULL ]
[ = default ] [ READONLY ] }
[ , ...n ]
]
)
RETURNS @return_variable TABLE <table_type_definition>
[ WITH <function_option> [ , ...n ] ]
[ AS ]
BEGIN
function_body
RETURN
END
[ ; ]
Składnia klauzul funkcji Transact-SQL.
<function_option> ::=
{
[ ENCRYPTION ]
| [ SCHEMABINDING ]
| [ RETURNS NULL ON NULL INPUT | CALLED ON NULL INPUT ]
| [ EXECUTE_AS_Clause ]
| [ INLINE = { ON | OFF } ]
}
<table_type_definition> ::=
( { <column_definition> <column_constraint>
| <computed_column_definition> }
[ <table_constraint> ] [ , ...n ]
)
<column_definition> ::=
{
{ column_name data_type }
[ [ DEFAULT constant_expression ]
[ COLLATE collation_name ] | [ ROWGUIDCOL ]
]
| [ IDENTITY [ (seed , increment ) ] ]
[ <column_constraint> [ ...n ] ]
}
<column_constraint> ::=
{
[ NULL | NOT NULL ]
{ PRIMARY KEY | UNIQUE }
[ CLUSTERED | NONCLUSTERED ]
[ WITH FILLFACTOR = fillfactor
| WITH ( <index_option> [ , ...n ] )
[ ON { filegroup | "default" } ] ]
| [ CHECK ( logical_expression ) ] [ , ...n ]
}
<computed_column_definition> ::=
column_name AS computed_column_expression
<table_constraint> ::=
{
{ PRIMARY KEY | UNIQUE }
[ CLUSTERED | NONCLUSTERED ]
( column_name [ ASC | DESC ] [ , ...n ]
[ WITH FILLFACTOR = fillfactor
| WITH ( <index_option> [ , ...n ] )
| [ CHECK ( logical_expression ) ] [ , ...n ]
}
<index_option> ::=
{
PAD_INDEX = { ON | OFF }
| FILLFACTOR = fillfactor
| IGNORE_DUP_KEY = { ON | OFF }
| STATISTICS_NORECOMPUTE = { ON | OFF }
| ALLOW_ROW_LOCKS = { ON | OFF }
| ALLOW_PAGE_LOCKS = { ON | OFF }
}
Składnia funkcji skalarnych CLR.
CREATE [ OR ALTER ] FUNCTION [ schema_name. ] function_name
( { @parameter_name [ AS ] [ type_schema_name. ] parameter_data_type [ NULL ]
[ = default ] }
[ , ...n ]
)
RETURNS { return_data_type }
[ WITH <clr_function_option> [ , ...n ] ]
[ AS ] EXTERNAL NAME <method_specifier>
[ ; ]
Składnia funkcji CLR z wartościami tabelarycznymi.
CREATE [ OR ALTER ] FUNCTION [ schema_name. ] function_name
( { @parameter_name [ AS ] [ type_schema_name. ] parameter_data_type [ NULL ]
[ = default ] }
[ , ...n ]
)
RETURNS TABLE <clr_table_type_definition>
[ WITH <clr_function_option> [ , ...n ] ]
[ ORDER ( <order_clause> ) ]
[ AS ] EXTERNAL NAME <method_specifier>
[ ; ]
Składnia klauzul funkcji CLR.
<order_clause> ::=
{
<column_name_in_clr_table_type_definition>
[ ASC | DESC ]
} [ , ...n ]
<method_specifier> ::=
assembly_name.class_name.method_name
<clr_function_option> ::=
{
[ RETURNS NULL ON NULL INPUT | CALLED ON NULL INPUT ]
| [ EXECUTE_AS_Clause ]
}
<clr_table_type_definition> ::=
( { column_name data_type } [ , ...n ] )
Składnia OLTP w pamięci dla natywnie skompilowanych, skalarnych funkcji zdefiniowanych przez użytkownika.
CREATE [ OR ALTER ] FUNCTION [ schema_name. ] function_name
( [ { @parameter_name [ AS ] [ type_schema_name. ] parameter_data_type
[ NULL | NOT NULL ] [ = default ] [ READONLY ] }
[ , ...n ]
]
)
RETURNS return_data_type
WITH <function_option> [ , ...n ]
[ AS ]
BEGIN ATOMIC WITH (set_option [ , ... n ] )
function_body
RETURN scalar_expression
END
<function_option> ::=
{
| NATIVE_COMPILATION
| SCHEMABINDING
| [ EXECUTE_AS_Clause ]
| [ RETURNS NULL ON NULL INPUT | CALLED ON NULL INPUT ]
}
Arguments
LUB ALTER
Dotyczy: SQL Server 2016 (13.x) SP 1 i nowszych wersji oraz Azure SQL Database.
Warunkowo zmienia funkcję tylko wtedy, gdy już istnieje.
Opcjonalna OR ALTER składnia jest dostępna dla środowiska CLR, począwszy od SQL Server 2016 (13.x) SP 1 CU 1.
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 dotyczącymi identyfikatorów i muszą być unikatowe w bazie danych i jej schemacie.
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, używając 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ą zastępować tylko stałe; Nie można ich używać zamiast nazw tabel, nazw kolumn ani nazw innych obiektów bazy danych.
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 są obcinane do zdefiniowanego rozmiaru, a instrukcja INSERT lub UPDATE powiedzie się.
[ type_schema_name. ] parameter_data_type
Typ danych parametru i opcjonalnie schemat, do którego należy. W przypadku funkcji Transact-SQL dozwolone są wszystkie typy danych, w tym typy zdefiniowane przez użytkownika CLR i typy tabel zdefiniowanych przez użytkownika, z wyjątkiem typu danych znacznika czasu . W przypadku funkcji CLR dozwolone są wszystkie typy danych, w tym typy zdefiniowane przez użytkownika CLR, z wyjątkiem typów danych text, ntext, obrazów, tabel zdefiniowanych przez użytkownika i znaczników czasu . Typów nieskalarnych, kursora i tabeli, nie można określić jako parametrycznego typu danych w funkcjach Transact-SQL lub CLR.
Jeśli type_schema_name nie zostanie określona, aparat bazy danych szuka wartości scalar_parameter_data_type w następującej kolejności:
- Schemat zawierający nazwy typów danych systemu SQL Server.
- Domyślny schemat bieżącego użytkownika w bieżącej bazie danych.
- Schemat
dbow bieżącej bazie danych.
[ = 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.
Domyślne wartości parametrów można określić dla funkcji CLR, z wyjątkiem typów danych varchar(max) i varbinary(max).
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ą.
DEFAULT Jednak słowo kluczowe nie jest wymagane podczas wywoływania funkcji skalarnej przy użyciu instrukcjiEXECUTE.
READONLY
Wskazuje, że parametru nie można zaktualizować ani zmodyfikować w definicji funkcji.
READONLY jest wymagany dla parametrów typu tabeli zdefiniowanych przez użytkownika (TVP) i nie może być używany dla żadnego innego typu parametru.
return_data_type
Wartość zwracana przez skalarną funkcję zdefiniowaną przez użytkownika. W przypadku funkcji Transact-SQL dozwolone są wszystkie typy danych, w tym typy zdefiniowane przez użytkownika CLR, z wyjątkiem typu danych znacznika czasu . W przypadku funkcji CLR dozwolone są wszystkie typy danych, w tym typy zdefiniowane przez użytkownika CLR, z wyjątkiem typów danych text, ntext, image i timestamp . Typów nieskalarnych, kursora i tabeli, nie można określić jako zwracanego typu danych w funkcjach Transact-SQL lub CLR.
function_body
Określa, że seria Transact-SQL instrukcji, które razem nie powodują efektu ubocznego, takiego jak modyfikowanie tabeli, definiują wartość funkcji. function_body jest używany tylko w funkcjach skalarnych i wieloinstrukcyjnych funkcjach zliczających tabelę (MSTVF).
W funkcjach skalarnych function_body jest serią Transact-SQL instrukcji, które razem dają w wyniku wartość skalarną.
W MSTVF function_body jest serią Transact-SQL instrukcji, które wypełniają zmienną zwracaną TABLE .
scalar_expression
Określa wartość skalarną zwracaną przez funkcję skalarną.
TABLE
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 formatach TVF wartość zwracana TABLE jest definiowana za pomocą pojedynczej SELECT instrukcji. Funkcje wbudowane nie mają skojarzonych zmiennych zwracanych.
W funkcjach z wieloma instrukcjami (MSTVFs) @return_variable jest zmienną używaną TABLE do przechowywania i gromadzenia wierszy, które powinny być zwracane jako wartość funkcji.
@
return_variable można określić tylko dla funkcji Transact-SQL, a nie dla funkcji CLR.
select_stmt
Pojedyncza SELECT instrukcja definiująca wartość zwracaną przez wbudowaną funkcję zwracającą tabelę (TVF).
ZAMÓWIENIE (<order_clause>)
Określa kolejność, w jakiej są zwracane wyniki z funkcji zwracającej tabelę. Aby uzyskać więcej informacji, zobacz sekcję Używanie kolejności sortowania w funkcjach zliczanych w tabeli CLR w dalszej części tego artykułu.
NAZWA ZEWNĘTRZNA <method_specifier>assembly_name.class_name. method_name
Dotyczy: SQL Server 2008 (10.0.x) SP 1 i nowsze wersje.
Określa zestaw i metodę, do których ma się odnosić nazwa utworzonej funkcji.
assembly_name — musi być zgodna z wartością w kolumnie
nameSELECT * FROM sys.assemblies;.Nazwa, która została użyta w instrukcji
CREATE ASSEMBLY.class_name — musi być zgodna z wartością w kolumnie
assembly_nameSELECT * FROM sys.assembly_modules;.Często wartość zawiera osadzoną kropkę lub kropkę. W takich przypadkach składnia Transact-SQL wymaga, aby wartość była ograniczona parą nawiasów kwadratowych (
[]) lub parą podwójnych cudzysłowów ("").method_name — musi być zgodna z wartością w kolumnie
method_nameSELECT * FROM sys.assembly_modules;.Metoda musi być statyczna.
W typowym przykładzie dla MyFood.dll, w którym wszystkie typy znajdują się MyFood w przestrzeni nazw, EXTERNAL NAME wartość może być MyFood.[MyFood.MyClass].MyStaticMethod.
Domyślnie SQL Server nie może wykonać kodu CLR. Można tworzyć, modyfikować i usuwać obiekty bazy danych, które odwołują się do modułów środowiska uruchomieniowego języka wspólnego. Nie można jednak wykonywać tych odwołań w SQL Server, dopóki nie włączysz opcji clr włączonej. Aby włączyć tę opcję, użyj sp_configure. Ta opcja nie jest dostępna w zawartej bazie danych.
< > table_type_definition ( { <column_definition><column_constraint | <> computed_column_definition } [ <table_constraint> ] [ , ... n ] )
Definiuje typ danych tabeli dla funkcji Transact-SQL. Deklaracja tabeli zawiera definicje kolumn i ograniczenia kolumn lub tabel. Tabela jest zawsze umieszczana w podstawowej grupie plików.
< > clr_table_type_definition ( { column_namedata_type } [ , ... n ] )
Dotyczy: SQL Server 2008 (10.0.x) SP 1 i nowsze wersje oraz Azure SQL Database (wersja zapoznawcza w niektórych regionach).
Definiuje typy danych tabeli dla funkcji CLR. Deklaracja tabeli zawiera tylko nazwy kolumn i typy danych. Tabela jest zawsze umieszczana w podstawowej grupie plików.
NULL | NIE NULL
Obsługiwane tylko w przypadku natywnie skompilowanych, skalarnych funkcji zdefiniowanych przez użytkownika. Aby uzyskać więcej informacji, zobacz Scalar User-Defined Functions for In-Memory OLTP.
NATIVE_COMPILATION
Wskazuje, czy funkcja zdefiniowana przez użytkownika jest kompilowana natywnie. Ten argument jest wymagany w przypadku natywnie skompilowanych, skalarnych funkcji zdefiniowanych przez użytkownika.
ROZPOCZNIJ ATOMOWY OD
Wymagane i obsługiwane tylko w przypadku natywnie skompilowanych skalarnych funkcji zdefiniowanych przez użytkownika. Aby uzyskać więcej informacji, zobacz Bloki atomowe w procedurach natywnych.
SCHEMABINDING
Argument SCHEMABINDING jest wymagany w przypadku natywnie skompilowanych, skalarnych funkcji zdefiniowanych przez użytkownika.
WYKONAJ JAKO
EXECUTE AS jest wymagany dla natywnie skompilowanych, skalarnych funkcji zdefiniowanych przez użytkownika.
< > function_option ::= i <clr_function_option> ::=
Określa, że funkcja ma co najmniej jedną z następujących opcji.
ENCRYPTION
Dotyczy: SQL Server 2008 (10.0.x) SP 1 i nowsze wersje.
Wskazuje, że Aparat baz danych konwertuje oryginalny tekst instrukcji CREATE FUNCTION na format zaciemniony. Dane wyjściowe zaciemniania nie są bezpośrednio widoczne w żadnych widokach katalogu. Użytkownicy, którzy nie mają dostępu do tabel systemowych lub plików bazy danych, nie mogą odzyskać zaciemnionego tekstu. Tekst jest jednak dostępny dla uprzywilejowanych użytkowników, którzy mogą uzyskiwać dostęp do tabel systemowych za pośrednictwem połączenia diagnostycznego dla administratorów baz danych lub bezpośrednio uzyskiwać dostęp do plików bazy danych. Ponadto użytkownicy, którzy mogą dołączyć debuger do procesu serwera, mogą pobrać oryginalną procedurę z pamięci w czasie wykonywania. Aby uzyskać więcej informacji na temat uzyskiwania dostępu do metadanych systemu, zobacz Konfiguracja widoczności metadanych.
Użycie tej opcji uniemożliwia publikowanie funkcji w ramach replikacji programu SQL Server. Nie można określić tej opcji dla funkcji CLR.
SCHEMABINDING
Określa, że funkcja jest powiązana z obiektami bazy danych, do których się odwołuje. Po SCHEMABINDING określeniu obiektów podstawowych nie można modyfikować w sposób, który miałby 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
ALTERzSCHEMABINDINGnieokreśloną opcją.
Funkcja może być powiązana ze schematem tylko wtedy, gdy spełnione są następujące warunki:
- Funkcja jest funkcją Transact-SQL.
- Funkcje i widoki zdefiniowane przez użytkownika, do których odwołuje się funkcja, są również powiązane ze schematem.
- Obiekty, do których odwołuje się funkcja, są przywoływane przy użyciu nazwy dwuczęściowej.
- Funkcja i obiekty, do których się odwołuje, należą do tej samej bazy danych.
- Użytkownik, który wykonał instrukcję
CREATE FUNCTION, maREFERENCESuprawnienia do obiektów bazy danych, do których odwołuje się funkcja.
ZWRACA WARTOŚĆ NULL W PRZYPADKU DANYCH WEJŚCIOWYCH O WARTOŚCI NULL | WYWOŁYWANE PRZY DANYCH WEJŚCIOWYCH NULL
Określa OnNULLCall atrybut funkcji skalarnej. Jeśli nie zostanie określony, CALLED ON NULL INPUT jest domyślnie implikowany. Innymi słowy, treść funkcji jest wykonywana nawet wtedy, gdy NULL jest przekazywana jako argument.
Jeśli RETURNS NULL ON NULL INPUT jest określony w funkcji CLR, oznacza to, że SQL Server może zwrócić NULL , gdy dowolny z otrzymanych argumentów to NULL, bez faktycznego wywoływania treści funkcji. Jeśli metoda funkcji CLR określona w <method_specifier> ma już atrybut niestandardowy, który wskazuje RETURNS NULL ON NULL INPUT, ale instrukcja CREATE FUNCTION wskazuje CALLED ON NULL INPUT, instrukcja CREATE FUNCTION ma pierwszeństwo. Nie można określić atrybutu OnNULLCall dla funkcji CLR z wartościami tabeli.
WYKONAJ JAKO
Określa kontekst zabezpieczeń, w którym jest wykonywana funkcja zdefiniowana przez użytkownika. W związku z tym można kontrolować, które konto użytkownika jest używane przez program SQL Server do sprawdzania poprawności uprawnień do wszystkich obiektów bazy danych, do których odwołuje się funkcja.
EXECUTE AS Nie można określić dla wbudowanych funkcji z wartościami tabeli.
Aby uzyskać więcej informacji, zobacz Klauzula EXECUTE AS (Transact-SQL).
INLINE = { WŁ. | WYŁĄCZONY }
Dotyczy: SQL Server 2019 (15.x) i nowsze wersje oraz Azure SQL Database.
Określa, czy ta skalarna funkcja zdefiniowana przez użytkownika powinna być wbudowana, czy nie. Ta klauzula ma zastosowanie tylko do skalarnych funkcji zdefiniowanych przez użytkownika. Klauzula INLINE nie jest obowiązkowa. Jeśli klauzula INLINE nie zostanie określona, zostanie automatycznie ustawiona na ON lub OFF na podstawie tego, czy funkcja zdefiniowana przez użytkownika jest wbudowana. Jeśli INLINE = ON zostanie określony, ale okaże się, że funkcja zdefiniowana przez użytkownika nie jest wbudowana, zgłaszany jest błąd. Aby uzyskać więcej informacji, zobacz Scalar UDF Inlining (Scalar UDF Inlining).
< > column_definition ::=
Definiuje typ danych tabeli. Deklaracja tabeli zawiera definicje kolumn i ograniczenia. W przypadku funkcji CLR można określić tylko column_name i data_type .
column_name
Nazwa kolumny w tabeli. Nazwy kolumn muszą być zgodne z regułami dotyczącymi identyfikatorów i muszą być unikatowe w tabeli. column_name może składać się z od 1 do 128 znaków.
data_type
Określa typ danych kolumny. W przypadku funkcji Transact-SQL dozwolone są wszystkie typy danych, w tym typy zdefiniowane przez użytkownika CLR, z wyjątkiem znacznika czasu. W przypadku funkcji CLR dozwolone są wszystkie typy danych, w tym typy zdefiniowane przez użytkownika CLR, z wyjątkiem text, ntext, image, char, varchar, varchar(max) i timestamp. Nie można określić kursora typu nieskalarnego jako typu danych kolumny w funkcjach Transact-SQL lub CLR.
DOMYŚLNY constant_expression
Określa wartość podaną dla kolumny, gdy wartość nie jest jawnie podana podczas wstawiania.
constant_expression jest stałą, NULLlub wartością funkcji systemowej.
DEFAULT Definicje można stosować do dowolnej kolumny z wyjątkiem tych, które mają tę IDENTITY właściwość.
DEFAULT nie można określić dla funkcji CLR z wartościami tabeli.
SORTOWANIE collation_name
Określa sortowanie dla kolumny. Jeśli nie zostanie określona, kolumnie zostanie przypisane domyślne sortowanie bazy danych. Nazwa sortowania może być nazwą sortowania systemu Windows lub nazwą sortowania SQL. Aby uzyskać listę sortowań i uzyskać więcej informacji na ich temat, zobacz Nazwa sortowania systemu Windows (Transact-SQL) i Nazwa sortowania programu SQL Server (Transact-SQL).
Klauzula COLLATE może służyć do zmiany sortowania tylko kolumn typów danych char, varchar, nchar i nvarchar .
COLLATE nie można określić dla funkcji CLR z wartościami tabeli.
ROWGUIDCOL
Wskazuje, że nowa kolumna jest wierszem z globalnie unikatowym identyfikatorem. Jako kolumnę można wyznaczyć tylko jedną kolumnę unikatowego identyfikatora na tabelę ROWGUIDCOL . Właściwość ROWGUIDCOL można przypisać tylko do kolumny uniqueidentifier .
Właściwość ROWGUIDCOL nie wymusza unikatowości wartości przechowywanych w kolumnie. Nie generuje również automatycznie wartości dla nowych wierszy wstawianych do tabeli. Aby wygenerować unikatowe wartości dla każdej kolumny NEWID , użyj funkcji on INSERT statements. Można określić wartość domyślną; NEWID Nie można jednak określić jako domyślnej.
IDENTITY
Wskazuje, że nowa kolumna jest kolumną tożsamości. Po dodaniu nowego wiersza do tabeli program SQL Server udostępnia unikatową, przyrostową wartość kolumny. Kolumny tożsamości są zwykle używane razem z PRIMARY KEY ograniczeniami, aby służyć jako unikatowy identyfikator wiersza dla tabeli. Właściwość IDENTITY można przypisać do kolumn tinyint, smallint, int, bigint, decimal(p,0) lub numeric(p,0). Dla tabeli można utworzyć tylko jedną kolumnę tożsamości. Powiązanych wartości domyślnych i DEFAULT ograniczeń nie można używać z kolumną tożsamości. Należy określić zarówno ziarno , jak i przyrost lub żadne. Jeśli żadna z nich nie zostanie określona, wartość domyślna to (1,1).
IDENTITY nie można określić dla funkcji CLR z wartościami tabeli.
seed
Wartość całkowita, która ma zostać przypisana do pierwszego wiersza w tabeli.
increment
Wartość całkowita, która ma zostać dodana do wartości początkowej dla kolejnych wierszy w tabeli.
< > column_constraint ::= i <table_constraint> ::=
Definiuje ograniczenie dla określonej kolumny lub tabeli. W przypadku funkcji CLR jedynym dozwolonym typem ograniczenia jest NULL. Nazwane ograniczenia są niedozwolone.
NULL | NIE NULL
Określa, czy w kolumnie są dozwolone wartości null.
NULL nie jest ściśle ograniczeniem, ale może być określony tak jak NOT NULL.
NOT NULL nie można określić dla funkcji CLR z wartościami tabeli.
KLUCZ PODSTAWOWY
Ograniczenie, które wymusza integralność jednostki dla określonej kolumny za pomocą unikatowego indeksu. W funkcjach zdefiniowanych przez użytkownika z wartościami tabelarycznymi PRIMARY KEY ograniczenie można utworzyć tylko dla jednej kolumny na tabelę.
PRIMARY KEY nie można określić dla funkcji CLR z wartościami tabeli.
UNIQUE
Ograniczenie zapewniające integralność jednostki dla określonej kolumny lub kolumn za pośrednictwem unikatowego indeksu. Tabela może mieć wiele UNIQUE ograniczeń.
UNIQUE nie można określić dla funkcji CLR z wartościami tabeli.
KLASTROWANE | NIEKLASTROWANE
Wskaż, że dla ograniczenia or PRIMARY KEY został utworzony UNIQUE indeks klastrowany lub nieklastrowany.
PRIMARY KEY Ograniczenia używają CLUSTERED, a UNIQUE ograniczenia używają NONCLUSTERED.
CLUSTERED można określić tylko dla jednego wiązania. Jeśli CLUSTERED jest określony dla UNIQUE ograniczenia i PRIMARY KEY ograniczenie jest również określone, używa PRIMARY KEYNONCLUSTERED.
CLUSTERED i NONCLUSTERED nie można określić dla funkcji CLR z wartościami tabelarycznymi.
CHECK
Ograniczenie wymuszające integralność domeny przez ograniczenie możliwych wartości, które można wprowadzić w kolumnie lub kolumnach.
CHECK Nie można określić ograniczeń dla funkcji CLR z wartościami tabelarycznymi.
logical_expression
Wyrażenie logiczne, które zwraca TRUE wartość lub FALSE.
< > computed_column_definition ::=
Określa kolumnę obliczaną. Aby uzyskać więcej informacji na temat kolumn obliczeniowych, zobacz CREATE TABLE (Transact-SQL) .
column_name
Nazwa kolumny obliczanej.
computed_column_expression
Wyrażenie definiujące wartość obliczonej kolumny.
< > index_option ::=
Określa opcje indeksu dla indeksu PRIMARY KEY lub UNIQUE . Aby uzyskać więcej informacji na temat opcji indeksu, zobacz TWORZENIE INDEKSU (Transact-SQL).
PAD_INDEX = { ON | WYŁ. }
Określa dopełnienie indeksu. Wartość domyślna to OFF.
FILLFACTOR = wypełnienie
Określa wartość procentową wskazującą, jak bardzo Aparat baz danych powinien zapełnić poziom liścia każdej strony indeksu podczas tworzenia indeksu lub zmieniania go. fillfactor musi być wartością całkowitą z zakresu od 1 do 100. Wartość domyślna to 0.
IGNORE_DUP_KEY = { ON | WYŁ. }
Określa odpowiedź na błąd, gdy operacja wstawiania próbuje wstawić zduplikowane wartości klucza do unikatowego indeksu. Opcja IGNORE_DUP_KEY dotyczy tylko operacji wstawiania po utworzeniu lub ponownym utworzeniu indeksu. Wartość domyślna to OFF.
STATISTICS_NORECOMPUTE = { ON | WYŁ. }
Określa, czy statystyki rozkładu są obliczane ponownie. Wartość domyślna to OFF.
ALLOW_ROW_LOCKS = { ON | WYŁ. }
Określa, czy blokady wierszy są dozwolone. Wartość domyślna to ON.
ALLOW_PAGE_LOCKS = { ON | WYŁ. }
Określa, czy blokady strony są dozwolone. Wartość domyślna to ON.
Najlepsze rozwiązania
Jeśli funkcja zdefiniowana przez użytkownika nie zostanie utworzona za pomocą SCHEMABINDING klauzuli, zmiany wprowadzone w obiektach bazowych mogą mieć wpływ na definicję funkcji i generować nieoczekiwane wyniki po jej wywołaniu. Zalecamy zaimplementowanie jednej z następujących metod, aby upewnić się, że funkcja nie staje się nieaktualna z powodu zmian w jego obiektach bazowych:
Określ
WITH SCHEMABINDINGklauzulę podczas tworzenia funkcji. Ta opcja gwarantuje, że obiekty, do których odwołuje się definicja funkcji, nie mogą być modyfikowane, chyba że funkcja jest również modyfikowana.Wykonaj procedurę składowaną sp_refreshsqlmodule po zmodyfikowaniu dowolnego obiektu określonego w definicji funkcji.
Aby uzyskać więcej informacji i zapoznać się z zagadnieniami dotyczącymi wydajności wbudowanych funkcji zwracających tabelę (wbudowanych funkcji TVF) i wieloinstrukcyjnych funkcji zliczających tabelę (MSTVF), zobacz Tworzenie funkcji zdefiniowanych przez użytkownika (Aparat bazy danych).
Typy danych
Jeśli parametry są określone w funkcji CLR, powinny to być typy SQL Server zdefiniowane wcześniej dla scalar_parameter_data_type. Aby uzyskać więcej informacji na temat porównywania typów danych systemu SQL Server z typami danych integracji środowiska CLR lub typami danych środowiska uruchomieniowego wspólnego języka .NET Framework, zobacz Mapowanie danych parametrów środowiska CLR.
Aby SQL Server odwoływał się do poprawnej metody, gdy jest przeciążona w klasie, metoda wskazana w <method_specifier> temacie musi mieć następujące cechy:
- Otrzymaj taką samą liczbę parametrów, jak określono w
[ , ...n ]. - Odbieraj wszystkie parametry według wartości, a nie według odwołania.
- Użyj typów parametrów, które są zgodne z typami określonymi w funkcji SQL Server.
Jeśli zwracany typ danych funkcji CLR określa typ tabeli (RETURNS TABLE), zwracany typ danych metody w <method_specifier> powinien być typu IEnumerator lub IEnumerable, i zakłada, że interfejs jest implementowany przez twórcę funkcji. W przeciwieństwie do funkcji Transact-SQL, funkcje CLR nie mogą zawierać PRIMARY KEY, UNIQUEani CHECK ograniczeń w <table_type_definition>. Typy danych kolumn określonych w <table_type_definition> temacie muszą być zgodne z typami odpowiednich kolumn zestawu wyników zwracanego przez metodę w <method_specifier> czasie wykonywania. To sprawdzanie typu nie jest wykonywane w momencie tworzenia funkcji.
Aby uzyskać więcej informacji na temat programowania funkcji CLR, zobacz Funkcje User-Defined CLR.
Remarks
Funkcje skalarne mogą być wywoływane tam, gdzie są używane wyrażenia skalarne, które obejmują kolumny obliczeniowe i CHECK definicje ograniczeń. Funkcje skalarne można również wykonywać przy użyciu instrukcji EXECUTE (Transact-SQL). Funkcje skalarne muszą być wywoływane przy użyciu co najmniej dwuczęściowej nazwy funkcji (<schema>.<function>). Aby uzyskać więcej informacji na temat nazw wieloczęściowych, zobacz Transact-SQL Konwencje składni (Transact-SQL). Funkcje z wartościami tabeli mogą być wywoływane tam, gdzie wyrażenia tabeli są dozwolone w FROM klauzuli SELECT, INSERT, UPDATElub DELETE instrukcjach. Aby uzyskać więcej informacji, zobacz Wykonywanie funkcji zdefiniowanych przez użytkownika.
UDF w Microsoft Fabric Data Warehouse
Skalarne funkcje zdefiniowane przez użytkownika to funkcja w wersji zapoznawczej w magazynie danych sieci szkieletowej.
W Microsoft Fabric Data Warehouse skalarne UDF-y muszą być inlineowalne do zapytań SELECT ... FROM na tabelach użytkowników, ale nadal można tworzyć funkcje, które nie są inlineowalne. 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. Więcej informacji można znaleźć w wersji CREATE FUNCTION dla Fabric Data Warehouse.
Interoperability
W funkcji są poprawne następujące instrukcje:
- Instrukcje przypisania.
- Instrukcje control-of-flow z wyjątkiem
TRY...CATCHinstrukcji. -
DECLAREinstrukcje definiujące lokalne zmienne danych i lokalne kursory. -
SELECTInstrukcje zawierające listy wyboru z wyrażeniami, które przypisują wartości do zmiennych lokalnych. - Operacje kursorów odwołujące się do kursorów lokalnych, które są deklarowane, otwierane, zamykane i cofane alokacje w funkcji. Dozwolone są tylko
FETCHinstrukcje, które przypisują wartości do zmiennych lokalnych przy użyciu klauzuli;INTOinstrukcje,FETCHktóre zwracają dane do klienta, są niedozwolone. -
INSERT,UPDATEorazDELETEinstrukcje modyfikujące zmienne tabeli lokalnej. -
EXECUTEinstrukcje wywołujące rozszerzone procedury składowane.
Aby uzyskać więcej informacji, zobacz Tworzenie funkcji zdefiniowanych przez użytkownika (Aparat bazy danych).
Współdziałanie kolumn obliczeniowych
Funkcje mają następujące właściwości. Wartości tych właściwości określają, czy funkcje mogą być używane w kolumnach obliczeniowych, które mogą być utrwalane lub indeksowane.
| Property | Description | Notes |
|---|---|---|
IsDeterministic |
Funkcja jest deterministyczna lub niedeterministyczna. | Lokalny dostęp do danych jest dozwolony w funkcjach deterministycznych. Na przykład funkcje, które zawsze zwracają ten sam wynik za każdym razem, gdy są wywoływane przy użyciu określonego zestawu wartości wejściowych i z tym samym stanem bazy danych, będą oznaczone jako deterministyczne. |
IsPrecise |
Funkcja jest precyzyjna lub nieprecyzyjna. | Funkcje nieprecyzyjne zawierają operacje, takie jak operacje zmiennoprzecinkowe. |
IsSystemVerified |
Właściwości precyzji i determinizmu funkcji mogą być weryfikowane przez program SQL Server. | |
SystemDataAccess |
Funkcja uzyskuje dostęp do danych systemowych (katalogów systemowych lub wirtualnych tabel systemowych) w lokalnej instancji SQL Server. | |
UserDataAccess |
Funkcja uzyskuje dostęp do danych użytkownika w lokalnej instancji SQL Server. | Zawiera tabele zdefiniowane przez użytkownika i tabele tymczasowe, ale nie zmienne tabeli. |
Właściwości precyzji i determinizmu funkcji Transact-SQL są określane automatycznie przez program SQL Server. Właściwości dostępu do danych i determinizmu funkcji CLR mogą być określane przez użytkownika. Aby uzyskać więcej informacji, zobacz Integracja środowiska CLR: atrybuty niestandardowe dla procedur CLR.
Aby wyświetlić bieżące wartości tych właściwości, należy użyć funkcji OBJECTPROPERTYEX (Transact-SQL).
Important
Funkcje muszą być tworzone za pomocą SCHEMABINDING , aby były deterministyczne.
Kolumna obliczeniowa, która wywołuje funkcję zdefiniowaną przez użytkownika, może być używana w indeksie, gdy funkcja zdefiniowana przez użytkownika ma następujące wartości właściwości:
-
IsDeterministicjesttrue -
IsSystemVerifiedistrue(chyba że kolumna obliczeniowa jest utrwalana) -
UserDataAccessjestfalse -
SystemDataAccessjestfalse
Aby uzyskać więcej informacji, zobacz Indeksy na obliczanych kolumnach.
Wywoływanie rozszerzonych procedur składowanych z funkcji
Rozszerzona procedura składowana, gdy wywołuje ją z wnętrza funkcji, nie może zwracać zestawów wyników do klienta. Wszystkie interfejsy API ODS, które zwracają zestawy wyników do klienta, zwracają FAIL. Rozszerzona procedura składowana może nawiązać połączenie z powrotem z wystąpieniem programu SQL Server; Nie powinien jednak próbować dołączyć do tej samej transakcji co funkcja, która wywołała rozszerzoną procedurę składowaną.
Podobnie jak w przypadku wywołań z procedury wsadowej lub składowanej, rozszerzona procedura składowana jest wykonywana w kontekście konta zabezpieczeń systemu Windows, w ramach którego jest uruchomiony program SQL Server. Właściciel procedury składowanej powinien wziąć pod uwagę ten scenariusz podczas udzielania EXECUTE uprawnień do niej użytkownikom.
Limitations
Funkcji zdefiniowanych przez użytkownika nie można używać do wykonywania akcji modyfikujących stan bazy danych.
Funkcje zdefiniowane przez użytkownika nie mogą zawierać klauzuli OUTPUT INTO, która ma tabelę jako element docelowy.
Następujące instrukcje Service Broker nie mogą być uwzględnione w definicji funkcji zdefiniowanej przez użytkownika Transact-SQL:
BEGIN DIALOG CONVERSATIONEND CONVERSATIONGET CONVERSATION GROUPMOVE CONVERSATIONRECEIVESEND
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 można zagnieżdżać maksymalnie na 32 poziomach. Przekroczenie maksymalnych poziomów zagnieżdżania powoduje niepowodzenie całego łańcucha funkcji wywołujących. Każde odwołanie do kodu zarządzanego z funkcji zdefiniowanej przez użytkownika Transact-SQL jest liczone jako jeden poziom względem limitu zagnieżdżenia na poziomie 32. Metody wywoływane z poziomu kodu zarządzanego nie są liczone względem tego limitu.
Używanie kolejności sortowania w funkcjach CLR z wartościami tabelarycznymi
W przypadku korzystania z klauzuli ORDER w funkcjach zliczanych tabeli CLR postępuj zgodnie z następującymi wskazówkami:
Należy upewnić się, że wyniki są zawsze uporządkowane w określonej kolejności. Jeśli wyniki nie są w określonej kolejności, SQL Server generuje komunikat o błędzie po wykonaniu zapytania.
Jeśli klauzula
ORDERjest określona, dane wyjściowe funkcji zwracającej tabelę muszą być posortowane zgodnie z sortowaniem kolumny (jawne lub niejawne). Na przykład, jeśli sortowanie kolumn jest chińskie, zwrócone wyniki muszą być posortowane zgodnie z chińskimi regułami sortowania. (Sortowanie jest określone w DDL dla funkcji zwracającej tabelę lub uzyskane z sortowania bazy danych).SQL Server zawsze weryfikuje klauzulę
ORDER, jeśli została określona, podczas zwracania wyników, czy procesor zapytań używa jej do wykonywania dalszych optymalizacji. Klauzuli należy używaćORDERtylko wtedy, gdy wiadomo, że jest ona przydatna dla procesora zapytań.Procesor zapytań programu SQL Server automatycznie korzysta z
ORDERtej klauzuli w następujących przypadkach:- Wstawianie zapytań, w których klauzula
ORDERjest zgodna z indeksem. -
ORDER BYklauzul, które są zgodne z klauzuląORDER. - Agregaty, gdzie
GROUP BYjest zgodne zORDERklauzulą. -
DISTINCTagregacje, w których odrębne kolumny są zgodne z klauzuląORDER.
- Wstawianie zapytań, w których klauzula
Klauzula ORDER nie gwarantuje uporządkowanych wyników po SELECT wykonaniu zapytania, chyba że ORDER BY jest również określona w zapytaniu. Zobacz sys.function_order_columns (Transact-SQL), aby uzyskać informacje na temat wykonywania zapytań dotyczących kolumn uwzględnionych w kolejności sortowania funkcji zwracających tabelę.
Metadata
W poniższej tabeli wymieniono widoki katalogu systemowego, których można używać do zwracania metadanych dotyczących funkcji zdefiniowanych przez użytkownika.
| Widok systemu | Description |
|---|---|
| sys.sql_modules | Zobacz przykład E w sekcji Przykłady. |
| sys.assembly_modules | Wyświetla informacje o funkcjach zdefiniowanych przez użytkownika CLR. |
| sys.parameters | Wyświetla informacje o parametrach zdefiniowanych w funkcjach zdefiniowanych przez użytkownika. |
| sys.sql_expression_dependencies | Wyświetla obiekty bazowe, do których odwołuje się funkcja. |
Permissions
Wymaga CREATE FUNCTION uprawnienia w bazie danych i ALTER uprawnienia do schematu, w którym jest tworzona funkcja. Jeśli funkcja określa typ zdefiniowany przez użytkownika, wymaga uprawnienia EXECUTE do tego typu.
Examples
Aby uzyskać więcej przykładów i zagadnień dotyczących wydajności funkcji zdefiniowanych przez użytkownika, zobacz Tworzenie funkcji zdefiniowanych przez użytkownika (Aparat bazy danych).
A. Użyj funkcji zdefiniowanej przez użytkownika o wartości skalarnej, która oblicza tydzień ISO
W poniższym przykładzie tworzona jest funkcja ISOweekzdefiniowana przez użytkownika. Ta funkcja przyjmuje argument daty i oblicza numer tygodnia ISO. Aby ta funkcja obliczała poprawnie, SET DATEFIRST 1 musi zostać wywołana przed wywołaniem funkcji.
W przykładzie pokazano również użycie klauzuli EXECUTE AS (Transact-SQL) w celu określenia kontekstu zabezpieczeń, w którym można wykonać procedurę składowaną. W tym przykładzie opcja CALLER określa, że procedura jest wykonywana w kontekście użytkownika, który ją wywołuje. Inne opcje, które można określić, to SELF, OWNER, i user_name.
Oto wywołanie funkcji.
DATEFIRST jest ustawione na 1.
CREATE FUNCTION dbo.ISOweek (@DATE DATETIME)
RETURNS INT
WITH EXECUTE AS CALLER
AS
BEGIN
DECLARE @ISOweek INT;
SET @ISOweek = DATEPART(wk, @DATE) + 1 -
DATEPART(wk, CAST(DATEPART(yy, @DATE) AS CHAR(4)) + '0104');
--Special cases: Jan 1-3 may belong to the previous year
IF (@ISOweek = 0)
SET @ISOweek = dbo.ISOweek(CAST(DATEPART(yy, @DATE) - 1 AS CHAR(4))
+ '12' + CAST(24 + DATEPART(DAY, @DATE) AS CHAR(2))) + 1;
--Special case: Dec 29-31 may belong to the next year
IF ((DATEPART(mm, @DATE) = 12)
AND ((DATEPART(dd, @DATE) - DATEPART(dw, @DATE)) >= 28))
SET @ISOweek = 1;
RETURN (@ISOweek);
END;
GO
SET DATEFIRST 1;
SELECT dbo.ISOweek(CONVERT(DATETIME, '12/26/2004', 101)) AS 'ISO Week';
Oto zestaw wyników.
ISO Week
----------------
52
B. Tworzenie wbudowanej funkcji z wartościami tabelarycznymi
Poniższy przykład zwraca funkcję tabelową w linii w bazie AdventureWorks2025. Zwraca trzy kolumny ProductID, Name, oraz sumę sum od początku roku według sklepu dla YTD Total każdego produktu sprzedanego do sklepu.
CREATE FUNCTION Sales.ufn_SalesByStore (@storeid INT)
RETURNS TABLE
AS
RETURN (
SELECT P.ProductID, P.Name, SUM(SD.LineTotal) AS 'Total'
FROM Production.Product AS P
INNER JOIN Sales.SalesOrderDetail AS SD ON SD.ProductID = P.ProductID
INNER JOIN Sales.SalesOrderHeader AS SH ON SH.SalesOrderID = SD.SalesOrderID
INNER JOIN Sales.Customer AS C ON SH.CustomerID = C.CustomerID
WHERE C.StoreID = @storeid
GROUP BY P.ProductID, P.Name
);
GO
Aby wywołać funkcję, uruchom to zapytanie.
SELECT * FROM Sales.ufn_SalesByStore (602);
C. Tworzenie wieloinstrukcyjnej funkcji zwracającej tabelę
W poniższym przykładzie tworzona jest funkcja ufn_FindReports(InEmpID) zwracająca AdventureWorks2025 tabelę w bazie danych. Po podaniu prawidłowego identyfikatora pracownika funkcja zwraca tabelę odpowiadającą wszystkim pracownikom, którzy podlegają pracownikowi bezpośrednio lub pośrednio. Funkcja używa rekurencyjnego wspólnego wyrażenia tabeli (CTE) w celu utworzenia hierarchicznej listy pracowników. Aby uzyskać więcej informacji na temat rekurencyjnych CTE, zobacz WITH common_table_expression (Transact-SQL).
CREATE FUNCTION dbo.ufn_FindReports (@InEmpID INT)
RETURNS @retFindReports TABLE (
EmployeeID INT PRIMARY KEY NOT NULL,
FirstName NVARCHAR(255) NOT NULL,
LastName NVARCHAR(255) NOT NULL,
JobTitle NVARCHAR(50) NOT NULL,
RecursionLevel INT NOT NULL
)
--Returns a result set that lists all the employees who report to the
--specific employee directly or indirectly.
AS
BEGIN
WITH EMP_cte (
EmployeeID,
OrganizationNode,
FirstName,
LastName,
JobTitle,
RecursionLevel
) -- CTE name and columns
AS (
-- Get the initial list of Employees for Manager n
SELECT e.BusinessEntityID,
OrganizationNode = ISNULL(e.OrganizationNode, CAST('/' AS HIERARCHYID)),
p.FirstName,
p.LastName,
e.JobTitle,
0
FROM HumanResources.Employee e
INNER JOIN Person.Person p
ON p.BusinessEntityID = e.BusinessEntityID
WHERE e.BusinessEntityID = @InEmpID
UNION ALL
-- Join recursive member to anchor
SELECT e.BusinessEntityID,
e.OrganizationNode,
p.FirstName,
p.LastName,
e.JobTitle,
RecursionLevel + 1
FROM HumanResources.Employee e
INNER JOIN EMP_cte
ON e.OrganizationNode.GetAncestor(1) = EMP_cte.OrganizationNode
INNER JOIN Person.Person p
ON p.BusinessEntityID = e.BusinessEntityID
)
-- Copy the required columns to the result of the function
INSERT @retFindReports
SELECT EmployeeID,
FirstName,
LastName,
JobTitle,
RecursionLevel
FROM EMP_cte
RETURN
END;
GO
-- Example invocation
SELECT EmployeeID,
FirstName,
LastName,
JobTitle,
RecursionLevel
FROM dbo.ufn_FindReports(1);
GO
D. Utwórz funkcję CLR
W przykładzie utworzono funkcję len_sCLR . Przed utworzeniem funkcji zestaw SurrogateStringFunction.dll jest rejestrowany w lokalnej bazie danych.
Dotyczy: SQL Server 2008 (10.0.x) SP 1 i nowsze wersje.
DECLARE @SamplesPath NVARCHAR(1024);
-- You may have to modify the value of this variable if you have
-- installed the sample in a location other than the default location.
SELECT @SamplesPath = REPLACE(physical_name,
'Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\DATA\master.mdf',
'Microsoft SQL Server\130\Samples\Engine\Programmability\CLR\'
)
FROM master.sys.database_files
WHERE name = 'master';
CREATE ASSEMBLY [SurrogateStringFunction]
FROM @SamplesPath + 'StringManipulate\CS\StringManipulate\bin\debug\SurrogateStringFunction.dll'
WITH PERMISSION_SET = EXTERNAL_ACCESS;
GO
CREATE FUNCTION [dbo].[len_s] (@str NVARCHAR(4000))
RETURNS BIGINT
AS
EXTERNAL NAME [SurrogateStringFunction].[Microsoft.Samples.SqlServer.SurrogateStringFunction].[LenS];
GO
Aby zapoznać się z przykładem tworzenia funkcji CLR z wartościami tabeli, zobacz CLR Table-Valued Functions.
E. Wyświetlanie definicji funkcji zdefiniowanych przez użytkownika
SELECT DEFINITION,
type
FROM sys.sql_modules AS m
INNER JOIN sys.objects AS o
ON m.object_id = o.object_id
AND type IN ('FN', 'IF', 'TF');
GO
Definicji funkcji utworzonych za pomocą tej ENCRYPTION opcji nie można wyświetlić za pomocą sys.sql_modulespolecenia ; jednak wyświetlane są inne informacje o zaszyfrowanych funkcjach.
Treści powiązane
- Tworzenie funkcji zdefiniowanych przez użytkownika (aparat bazy danych)
- ZMIEŃ FUNKCJĘ (Transact-SQL)
- FUNKCJA UPUSZCZANIA (Transact-SQL)
- OBJECTPROPERTYEX (Transact-SQL)
- sys.sql_moduły (Transact-SQL)
- sys.assembly_modules (Transact-SQL)
- WYKONAJ (Transact-SQL)
- Funkcje User-Defined CLR
- DANE ZDARZEŃ (Transact-SQL)
- TWORZENIE POLITYKI BEZPIECZEŃSTWA (Transact-SQL)