Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Dotyczy:SQL Server
Azure SQL Database
Azure SQL Managed Instance
SQL Database w 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.
Uwaga / Notatka
W przypadku usługi Microsoft Fabric Data Warehouse lub Azure Synapse Analytics zobacz CREATE FUNCTION (Azure Synapse Analytics i Microsoft Fabric).
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 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 ]
}
Argumenty (w programowaniu)
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
dbo
w 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
.
TYLKO DO ODCZYTU
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ą.
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 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
name
SELECT * 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_name
SELECT * 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_name
SELECT * 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.
POWIĄZANIE SCHEMATU
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.
SZYFROWANIE
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.
POWIĄZANIE SCHEMATU
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
ALTER
zSCHEMABINDING
nieokreś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
, maREFERENCES
uprawnienia 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ŚLNE constant_expression
Określa wartość podaną dla kolumny, gdy wartość nie jest jawnie podana podczas wstawiania.
constant_expression jest stałą, NULL
lub 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.
TOŻSAMOŚĆ
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.
nasienie
Wartość całkowita, która ma zostać przypisana do pierwszego wiersza w tabeli.
wzrost
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.
NIEPOWTARZALNY
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 KEY
NONCLUSTERED
.
CLUSTERED
i NONCLUSTERED
nie można określić dla funkcji CLR z wartościami tabelarycznymi.
SPRAWDZIĆ
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 = fillfactor
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 SCHEMABINDING
klauzulę 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
, UNIQUE
ani 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.
Uwagi
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
, UPDATE
lub DELETE
instrukcjach. Aby uzyskać więcej informacji, zobacz Wykonywanie funkcji zdefiniowanych przez użytkownika.
Współdziałanie
W funkcji są poprawne następujące instrukcje:
- Instrukcje przypisania.
- Instrukcje control-of-flow z wyjątkiem
TRY...CATCH
instrukcji. -
DECLARE
instrukcje definiujące lokalne zmienne danych i lokalne kursory. -
SELECT
Instrukcje 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
FETCH
instrukcje, które przypisują wartości do zmiennych lokalnych przy użyciu klauzuli;INTO
instrukcje,FETCH
które zwracają dane do klienta, są niedozwolone. -
INSERT
,UPDATE
orazDELETE
instrukcje modyfikujące zmienne tabeli lokalnej. -
EXECUTE
instrukcje 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.
Majątek | Opis | Notatki |
---|---|---|
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).
Ważne
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:
-
IsDeterministic
jesttrue
-
IsSystemVerified
istrue
(chyba że kolumna obliczeniowa jest utrwalana) -
UserDataAccess
jestfalse
-
SystemDataAccess
jestfalse
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.
Ograniczenia
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 CONVERSATION
END CONVERSATION
GET CONVERSATION GROUP
MOVE CONVERSATION
RECEIVE
SEND
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
ORDER
jest 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ćORDER
tylko wtedy, gdy wiadomo, że jest ona przydatna dla procesora zapytań.Procesor zapytań programu SQL Server automatycznie korzysta z
ORDER
tej klauzuli w następujących przypadkach:- Wstawianie zapytań, w których klauzula
ORDER
jest zgodna z indeksem. -
ORDER BY
klauzul, które są zgodne z klauzuląORDER
. - Agregaty, gdzie
GROUP BY
jest zgodne zORDER
klauzulą. -
DISTINCT
agregacje, 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ę.
Metadane
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 systemowy | Opis |
---|---|
sys.sql_moduły | Zobacz przykład E w sekcji Przykłady. |
sys.assembly_modules | Wyświetla informacje o funkcjach zdefiniowanych przez użytkownika CLR. |
sys.parameters (parametry systemu) | Wyświetla informacje o parametrach zdefiniowanych w funkcjach zdefiniowanych przez użytkownika. |
sys.sql_zależności_wyrażeń | Wyświetla obiekty bazowe, do których odwołuje się funkcja. |
Uprawnienia
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.
Przykłady
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).
Odp. Użyj funkcji zdefiniowanej przez użytkownika o wartości skalarnej, która oblicza tydzień ISO
W poniższym przykładzie tworzona jest funkcja ISOweek
zdefiniowana 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 wbudowaną funkcję zwracającą wartość tabeli w bazie danych AdventureWorks2022. 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 fn_FindReports(InEmpID)
zwracająca AdventureWorks2022
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_s
CLR . 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_modules
polecenia ; jednak wyświetlane są inne informacje o zaszyfrowanych funkcjach.
Powiązana zawartość
- 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)