Udostępnij za pośrednictwem


UTWÓRZ FUNKCJĘ (Transact-SQL)

Dotyczy:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceSQL 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 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.

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 z SCHEMABINDING 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 , ma REFERENCES 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łą, 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.

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 KEYNONCLUSTERED.

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, 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.

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, UPDATElub 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, UPDATEoraz DELETE 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 jest true
  • IsSystemVerified is true (chyba że kolumna obliczeniowa jest utrwalana)
  • UserDataAccess jest false
  • SystemDataAccess jest false

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 z ORDER klauzulą.
    • DISTINCT agregacje, w których odrębne kolumny są zgodne z klauzulą ORDER .

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 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 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_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.