CREATE FUNCTION (Transact-SQL)

Tworzy zdefiniowanej przez użytkownika funkcja w SQL Server 2008 R2.Zdefiniowana przez użytkownika funkcja jest Transact-SQL lub wspólnej procedury runtime (CLR) języka, który akceptuje parametry, wykonuje akcja, takich jak złożone obliczenia i zwraca wynik akcja jako wartość.Zwracana wartość może być wartość wartość skalarna (jedna zszywka) lub tabela.Ta instrukcja umożliwia utworzenie rutynowych wielokrotnego użytku, które mogą być używane w następujący sposób:

  • W Transact-SQL sprawozdania takie jak wybieranie

  • W aplikacjach wywołujących funkcja

  • W definicji innego zdefiniowanej przez użytkownika funkcja

  • Aby parameterize widok lub poprawy funkcjonalności indeksowany widok

  • Aby zdefiniować kolumna w tabela

  • Aby zdefiniować ograniczenie typu CHECK dla kolumna

  • Aby zastąpić procedura składowana

Ikona łącza do tematuJęzyka Transact-SQL składni konwencje

Składnia

--Transact-SQL Scalar Function Syntax
CREATE FUNCTION [ schema_name. ] function_name 
( [ { @parameter_name [ AS ][ type_schema_name. ] parameter_data_type 
    [ = default ] [ READONLY ] } 
    [ ,...n ]
  ]
)
RETURNS return_data_type
    [ WITH <function_option> [ ,...n ] ]
    [ AS ]
    BEGIN 
        function_body 
        RETURN scalar_expression
    END
[ ; ]

--Transact-SQL Inline Table-Valued Function Syntax 
CREATE FUNCTION [ schema_name. ] function_name 
( [ { @parameter_name [ AS ] [ type_schema_name. ] parameter_data_type 
    [ = default ] [ READONLY ] } 
    [ ,...n ]
  ]
)
RETURNS TABLE
    [ WITH <function_option> [ ,...n ] ]
    [ AS ]
    RETURN [ ( ] select_stmt [ ) ]
[ ; ]

--Transact-SQL Multistatement Table-valued Function Syntax
CREATE FUNCTION [ schema_name. ] function_name 
( [ { @parameter_name [ AS ] [ type_schema_name. ] parameter_data_type 
    [ = default ] [READONLY] } 
    [ ,...n ]
  ]
)
RETURNS @return_variable TABLE <table_type_definition>
    [ WITH <function_option> [ ,...n ] ]
    [ AS ]
    BEGIN 
        function_body 
        RETURN
    END
[ ; ]

--Transact-SQL Function Clauses 
<function_option>::= 
{
    [ ENCRYPTION ]
  | [ SCHEMABINDING ]
  | [ RETURNS NULL ON NULL INPUT | CALLED ON NULL INPUT ]
  | [ EXECUTE_AS_Clause ]
}

<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 } 
}

--CLR Scalar Function Syntax
CREATE FUNCTION [ schema_name. ] function_name 
( { @parameter_name [AS] [ type_schema_name. ] parameter_data_type 
    [ = default ] } 
    [ ,...n ]
)
RETURNS { return_data_type }
    [ WITH <clr_function_option> [ ,...n ] ]
    [ AS ] EXTERNAL NAME <method_specifier>
[ ; ]

--CLR Table-Valued Function Syntax
CREATE FUNCTION [ schema_name. ] function_name 
( { @parameter_name [AS] [ type_schema_name. ] parameter_data_type 
    [ = default ] } 
    [ ,...n ]
)
RETURNS TABLE <clr_table_type_definition> 
    [ WITH <clr_function_option> [ ,...n ] ]
    [ ORDER ( <order_clause> ) ]
    [ AS ] EXTERNAL NAME <method_specifier>
[ ; ]

--CLR Function Clauses
<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 ] )

Argumenty

  • schema_name
    Jest to nazwa schematu, do której należy dany funkcja zdefiniowanej przez użytkownika.

  • function_name
    Jest nazwą funkcjazdefiniowanej przez użytkownika.Nazwy funkcji muszą być zgodne z zasadami identyfikatorów i musi być unikatowa w obrębie bazy danych i jego schemat.

    Ostrzeżenie

    Nawiasy są wymagane po nazwę funkcja , nawet, jeżeli nie określono parametru.

  • @parameter_name
    Jest parametrem funkcjazdefiniowanej przez użytkownika.Jeden lub więcej parametrów może być zadeklarowana.

    funkcja może mieć maksymalnie 2,100 parametrów.Wartość każdego parametru deklarowanych musi być podany przez użytkownika funkcja jest wykonywana, chyba że określono domyślny parametr.

    Określ nazwę parametru za pomocą znaku (@) jako pierwszego znaku.Nazwa parametru muszą być zgodne z zasadami identyfikatorów.Parametry są lokalne funkcja; tej samej nazwy parametrów mogą być używane w innych funkcji.Parametry mogą mieć miejsce tylko o stałych; nie można używać zamiast nazwy tabela , nazwy kolumna lub nazw innych obiektów bazy danych.

    Ostrzeżenie

    ANSI_WARNINGS nie są honorowane przekazać parametry w procedura składowana, zdefiniowanej przez użytkownika funkcjalub deklaracji i zestaw zmienne winstrukcja partia. Na przykład, jeśli zmienna jest zdefiniowana jako char(3), a następnie zestaw na wartość większą niż trzy znaki, dane są obcięte zdefiniowany rozmiar i WSTAW lub instrukcja UPDATE zakończy się pomyślnie.

  • [ type_schema_name. ] parameter_data_type
    To typ danych parametru, a opcjonalnie schematu, do której należy.Dla Transact-SQL , wszystkie typy danych, w tym CLR typy zdefiniowane przez użytkownika i zdefiniowane przez użytkownika tabela , którzy są z wyjątkiem timestamp typu danych.Funkcje środowiska CLR dozwolone są wszystkie typy danych, w tym typy zdefiniowane przez użytkownika CLR z wyjątkiem text, ntext, image, typy zdefiniowane przez użytkownika tabela i timestamp typów danych.Typy nonscalar cursor i table, nie może być określony jako typ danych parametru w obu Transact-SQL lub funkcji środowiska CLR.

    Jeśli type_schema_name nie jest określony, Aparat baz danych szuka scalar_parameter_data_type w następującej kolejności:

    • Schemat, który zawiera nazwy SQL Server system typów danych.

    • Domyślny schemat bieżącego użytkownika w bieżącej bazie danych.

    • dbo Schematu w bieżącej bazie danych.

  • [ =default ]
    Jest wartością domyślną parametru.Jeśli default określonych wartości, funkcja mogą być wykonywane bez określenia wartości dla tego parametru.

    Ostrzeżenie

    Wartości domyślne parametrów można określić dla funkcji CLR z wyjątkiem varchar(max) i varbinary(max) typów danych.

    Gdy parametr funkcja ma wartość domyślną, słowo kluczowe, które domyślne muszą być określone podczas wywołania funkcja do pobierania wartości domyślnej.To zachowanie różni się od parametrów przy użyciu wartości domyślnych w procedurach przechowywanych, w których pominięcie parametru oznacza również wartość domyślną.Wyjątek to zachowanie jest podczas wywoływaniafunkcja wartość skalarnaprzy użyciu instrukcjaEXECUTE. Słowo kluczowe domyślne przy użyciu EXECUTE, nie jest wymagane.

  • TYLKO DO ODCZYTU
    Wskazuje, że parametr nie zaktualizowane, lub modyfikowane w definicji funkcja.Jeśli typ parametru jest typ zdefiniowany przez użytkownika tabela , należy określić tylko do odczytu.

  • return_data_type
    Jest zwracanej wartości wartość skalarna zdefiniowanej przez użytkownika funkcja.Dla Transact-SQL Funkcje, wszystkie typy danych, w tym CLR typy zdefiniowane przez użytkownika są dozwolone z wyjątkiem timestamp typu danych.Funkcje środowiska CLR dozwolone są wszystkie typy danych, w tym typy zdefiniowane przez użytkownika CLR z wyjątkiem text, ntext, image, i timestamp typów danych.Typy nonscalar cursor i table, nie może być określony jako typ zwracanych danych w obu Transact-SQL lub funkcji środowiska CLR.

  • function_body
    Określa, że szereg Transact-SQL instrukcji, które razem nie wytwarzają efektem ubocznym, takie jak modyfikowanie tabela, zdefiniuj wartość funkcja.function_bodyużywane tylko w funkcji wartość skalarna oraz wieloma instrukcjami tabela-wycenione funkcji.

    W funkcji wartość skalarna function_body to seria Transact-SQL instrukcji, które razem ocenić wartość wartość skalarna .

    W tabelazostanie-wycenione funkcje, function_body to seria Transact-SQL instrukcji, które wypełnić tabelę zwracają zmiennej.

  • scalar_expression
    Określa wartość wartość skalarna , która zwracafunkcja wartość skalarna.

  • TABELA
    Określa, że wartość zwracana tabela-ważnych funkcja jest tabela.Tylko stałe i @local_variables mogą być przekazywane do tabela-wycenione funkcji.

    W wierszu tabela-ważnych funkcji, wartość zwracana w tabeli jest definiowana poprzez pojedynczą instrukcjaSELECT.Wbudowane funkcje skojarzone zmiennych zwrotu nie jest konieczne.

    W tabelazostanie-wycenione funkcje, @return_variable jest zmienną Tabela służy do przechowywania i gromadzą się wierszy, które powinny być zwracane jako wartość funkcja.@return_variable można określić tylko dla Transact-SQL Funkcje, a nie dla funkcji środowiska CLR.

  • select_stmt
    SELECT pojedynczej instrukcja , która definiuje wartość zwracana w wierszu tabelajest-wycenione funkcja.

  • ZAMÓWIENIA (<order_clause>)
    Określa kolejność w której wyniki zwracanych z tabela-wycenione funkcja.Aby uzyskać więcej informacji zobacz sekcję "Wskazówki w przy użyciu porządku sortowania" w dalszej części tego tematu.

  • Nazwa zewnętrznego <method_specifier> assembly_name.class_name.method_name
    Określa metoda wirtualny plik dziennika powiązać z funkcja.assembly_namemusi być zgodna z istniejącego wirtualny plik dziennika w SQL Server w bieżącej bazie danych z widoczności na.class_namemusi być prawidłową SQL Server identyfikatora i musi istnieć jako klasa w wirtualny plik dziennika.Jeśli klasa ma kwalifikowanej nazw nazwa używana jest kropka (.) do oddzielania części obszaru nazw, nazwa klasy musi rozdzielany za pomocą nawiasów kwadratowych (   ) lub cudzysłów (" ").method_namemusi być prawidłową SQL Server identyfikatora i musi istnieć jako statyczna metoda w określona klasa

    Ostrzeżenie

    Domyślnie SQL Server nie może wykonać CLR kodu.Tworzenie, modyfikowanie i usuwanie obiektów bazy danych, które odwołują się do wspólnych moduły obsługi języka; Jednakże, nie możesz wykonać te odwołania w SQL Server do chwili włączenia clr włączona opcja.Aby włączyć tę opcję, użyj sp_configure.

  • <table_type_definition> ( { <column_definition> <column_constraint> | <computed_column_definition>} <table_constraint>] ,...n ] )
    Definiuje typ danych tabela Transact-SQL funkcja.tabeladeklaracja zawiera definicje kolumna i ograniczeń kolumna lub tabela . tabela jest zawsze umieszczany w podstawowa grupa plików.

  • <clr_table_type_definition > ( { column_namedata_type } [ ,...n ] )
    Określa typy danych tabela funkcja CLR.tabeladeklaracja zawiera tylko nazwy kolumna i typów danych. tabela jest zawsze umieszczany w podstawowa grupa plików.

<function_option>:: = i <clr_function_option>:: =

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

  • SZYFROWANIE
    Wskazuje, że Aparat baz danych przekonwertuje oryginalny tekst funkcji tworzenia instrukcja , aby posiadający mylącą format.Dane wyjściowe zaciemniania nie jest widoczne bezpośrednio w żadnych widoki wykazu.Użytkownicy, którzy nie mają dostępu do plików tabele systemowe lub bazy danych nie można pobrać posiadający mylącą tekstu.Jednak tekst będzie dostępny dla użytkowników uprzywilejowany, które można albo access tabele systemowe nad DAC portu lub bezpośrednio uzyskać dostępu do plików bazy danych.Ponadto użytkownicy, którzy mogą dołączać debuger do procesu serwera można pobrać oryginalnej procedury z pamięci w czasie wykonywania.Aby uzyskać więcej informacji dotyczących uzyskiwania dostępu do systemu metadane, zobacz Konfiguracja widoczność metadanych.

    Za pomocą tej opcji uniemożliwia publikowana jako część funkcja SQL Server replikacja.Tej opcji nie można określić dla funkcji środowiska CLR.

  • SCHEMABINDING
    Określa, że funkcja jest związany ze obiektów bazy danych, do których się odwołuje.Po określeniu SCHEMABINDING w sposób, który mogłyby wpłynąć na definicji funkcja nie można modyfikować obiektów podstawowych.Należy najpierw modyfikacji definicji funkcja , sam lub porzucone usunąć zależności na obiekcie, który ma być zmodyfikowany.

    powiązanie funkcja do obiektów, do których się on odwołuje usuwane są tylko wtedy, gdy wystąpi jedno z następujących czynności:

    • funkcja jest odrzucany.

    • funkcja jest modyfikowana przy użyciu instrukcja ALTER nie określono opcję SCHEMABINDING.

    funkcja może być schematu powiązane tylko wtedy, gdy są spełnione następujące warunki:

    • funkcja jest Transact-SQLfunkcja.

    • Funkcje zdefiniowane przez użytkownika i widoki odwołuje się funkcja są również związanych ze schematem.

    • Obiekty odwołuje się funkcja przyrównuje się przy użyciu nazwy dwóch części.

    • funkcja i obiektów, do których odwołuje się on należeć do tej samej bazy danych.

    • Użytkownik, który wykonał funkcji tworzenia instrukcja ma uprawnienie odwołania do obiektów bazy danych, które odwołuje się do funkcja .

  • ZWRACA WARTOŚĆ NULL NA NULL WPROWADZANIA | WYWOŁYWANEJ na wejściu NULL
    Określa OnNULLCall atrybut wartość skalarna— wartości funkcja.Jeśli nie określono o NAZWIE wprowadzania wartości NULL na jest implikowane domyślnie.Oznacza to, że w treści funkcja wykonywane nawet wtedy, gdy wartość NULL jest przekazywana jako argument.

    Jeśli w funkcja CLRzwraca wartość NULL na NULL wprowadzania jest określony, to wskazuje, że SQL Server może zwracać wartość NULL, gdy którykolwiek z argumentów odbiera ma wartość NULL, bez faktycznie powołania organu funkcja.Jeśli metoda funkcja CLR określonych w <method_specifier> już niestandardowy atrybut , który wskazuje zwraca wartość NULL na NULL wprowadzania, ale funkcja tworzenia instrukcja wskazuje o NAZWIE wprowadzania wartości NULL na, funkcja tworzenia instrukcja ma pierwszeństwo.OnNULLCallatrybut nie można określić dla środowiska CLR tabela-wycenione funkcji.

  • WYKONANIE klauzuli
    Określa kontekst zabezpieczeń, na którym wykonywany jest zdefiniowana przez użytkownika funkcja .W związku z tym, można kontrolować, które konto użytkownika SQL Server używa do sprawdzania uprawnień do żadnych obiektów bazy danych, do których odwołują się funkcja.

    Ostrzeżenie

    Nie można określić jako EXECUTE wbudowanej funkcji zdefiniowanej przez użytkownika.

    Aby uzyskać więcej informacji, zobacz WYKONANIE klauzuli (Transact-SQL).

<column_definition >:: =

Definiuje typ danych tabela .tabeladeklaracja zawiera definicje kolumna i ograniczeń. Funkcje środowiska CLR tylko column_name i data_type można określić.

  • column_name
    Jest to nazwa kolumna w tabela.Nazwy kolumn muszą być zgodne z zasadami dotyczącymi identyfikatorów i muszą być unikatowe w tabela.column_namemoże zawierać od 1 do 128 znaków.

  • data_type
    Określa typ danych kolumna .Dla Transact-SQL Funkcje, wszystkie typy danych, w tym CLR typy zdefiniowane przez użytkownika są dozwolone z wyjątkiem timestamp.Funkcje środowiska 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.Typ nonscalar cursor nie może być określony jako typ danych kolumna w obu Transact-SQL lub funkcji środowiska CLR.

  • DOMYŚLNEconstant_expression
    Określa wartość podana dla kolumna , gdy wartość nie jest jawnie podany podczas wstawiania.constant_expressionjest stała, NULL lub wartości funkcja systemu.Definicje domyślne mogą być stosowane do dowolnej kolumna z wyjątkiem tych, których tożsamość właściwość.Nie można określić DOMYŚLNĄ dla CLR tabela-wycenione funkcji.

  • SORTOWANIEcollation_name
    Określa sortowanie dla kolumna.Jeśli nie określono kolumna przypisano domyślne sortowanie bazy danych.Nazwa sortowania może być nazwa sortowanie systemu Windows lub nazwasortowanie SQL. Wykaz oraz więcej informacji o sortowaniu, zobacz Nazwa sortowania systemu Windows (Transact-SQL) i Nazwa sortowania SQL Server (Transact-SQL).

    klauzula COLLATE może służyć do zmiany ustawień sortowania tylko z kolumn char, varchar, nchar, i nvarchar typów danych.

    SORTUJ nie można określić dla środowiska CLR tabela-wycenione funkcji.

  • ROWGUIDCOL
    Nowa kolumna wskazuje kolumnawiersza unikatowy identyfikator globalny.Tylko jeden uniqueidentifierkolumna w tabela może być wyznaczony jako ROWGUIDCOL kolumna.ROWGUIDCOL właściwość można przypisać tylko do uniqueidentifier kolumna.

    właściwość ROWGUIDCOL nie wymusza unikatowość wartości przechowywane w kolumna.On również nie generuje automatycznie wartości nowe wiersze wstawione do tabela.Aby generować unikatowe wartości dla każdej kolumna, należy użyć NEWID funkcja w instrukcji INSERT.Można określić wartość domyślna; jednak NEWID nie można określić jako domyślny.

  • TOŻSAMOŚĆ
    Wskazuje, że nowa kolumna jest kolumnatożsamooci.Podczas dodawania nowego wiersza do tabela SQL Server zawiera unikatowy, przyrostowych wartości dla kolumna.Kolumny tożsamości są zwykle używane wraz z ograniczeń klucza podstawowego służyć jako identyfikator unikatowy wiersz tabela.Identyfikacja właściwość można przypisać do tinyint, smallint, int, bigint, decimal(p,0), lub numeric(p,0) kolumny.tabelamożna utworzyć tylko jedną kolumna .Domyślne powiązania i ograniczeń DOMYŚLNEJ nie można używać z kolumna.Należy określić obie seed i increment lub żadna.Jeśli zostanie podana żadna wartość domyślna to (1,1).

    Nie można określić tożsamości dla środowiska CLR tabela-wycenione funkcji.

    • seed
      Jest wartością całkowitą ma być przypisany do pierwszego wiersza w tabela.

    • increment
      Jest wartością całkowitą, aby dodać do seed wartość dla kolejnych wierszy w tabela.

<column_constraint >:: = i < table_constraint>:: =

Określa ograniczenie dla określonej kolumna lub tabela.Funkcje środowiska CLR typu ograniczenie tylko dozwolone jest NULL.Nazwany ograniczenia nie są dozwolone.

  • NULL | NIEDOZWOLONE WARTOŚCI NULL
    Określa, czy w kolumnadozwolone są wartości null .Wartość NULL nie jest ściśle ograniczenie, ale można określić tak samo jak NOT NULL.NIE dla CLR tabelanie można określić wartość NULL-wycenione funkcji.

  • KLUCZ PODSTAWOWY
    To ograniczenie wymusza obiekt integralność dla określonej kolumna za pomocą indeks unikatowy.W tabela-ważnych funkcji zdefiniowanej przez użytkownika ograniczenie klucza podstawowego można utworzyć tylko jedną kolumna tabela.Nie można określić klucz podstawowy dla środowiska CLR tabela-wycenione funkcji.

  • UNIKATOWE
    To ograniczenie, które zapewnia obiekt integralność dla określonej kolumna lub kolumn do indeks unikatowy.tabela może mieć wiele ograniczeń UNIQUE.Nie można określić unikatowe dla środowiska CLR tabela-wycenione funkcji.

  • KLASTROWANE | NIEKLASTROWANY
    Wskazać klastrowany lub indeks nieklastrowany jest tworzony dla ograniczenia na klucz podstawowy lub unikatowe.Ograniczenia na klucz podstawowy używać CLUSTERED, a ograniczenie typu UNIQUE NONCLUSTERED.

    Tylko jedno ograniczenie może wybrać CLUSTERED.Jeśli CLUSTERED określono dla ograniczenia UNIQUE i określony jest również ograniczenie na klucz podstawowy, klucz podstawowy używa NONCLUSTERED.

    Nie można określić CLUSTERED i NONCLUSTERED dla środowiska CLR tabela-wycenione funkcji.

  • WYBORU
    To ograniczenie wymusza domena integralność poprzez ograniczenie możliwych wartości, które mogą być wprowadzane do kolumna lub kolumn.Sprawdź, czy dla środowiska CLR tabelanie można określić ograniczenia-wycenione funkcji.

    • logical_expression
      Jest logiczną wyrażenie , które zwraca wartość PRAWDA lub FAŁSZ.

<computed_column_definition>:: =

Określa kolumnaobliczanej.Aby uzyskać więcej informacji na temat kolumny obliczane, zobacz CREATE TABLE (Transact-SQL).

  • column_name
    Jest to nazwa kolumnaobliczanej.

  • computed_column_expression
    To wyrażenie , które definiuje wartość kolumnaobliczanej.

<index_option> :: =

Określa opcje indeks klucza podstawowego lub unikatowy indeks.Aby uzyskać więcej informacji o opcjach indeksu, zobacz CREATE INDEX (Transact-SQL).

  • PAD_INDEX = {ON | OFF }
    Określa indeks uzupełnienie.Domyślnie jest wyłączona.

  • FILLFACTOR =fillfactor
    Określa wartość procentową, która wskazuje, jak pełne Aparat baz danych należy ustawić liść poziom każdej strona indeksu podczas tworzenia indeksu lub Zmień.fillfactormusi mieć wartość całkowitą od 1 do 100.Wartość domyślna to 0.

  • IGNORE_DUP_KEY = {ON | OFF }
    Określa odpowiedź błąd podczas operacji wstawiania spróbuje wstawić wartości zduplikowany klucz do indeks unikatowy.Opcja IGNORE_DUP_KEY dotyczy tylko wstawianie operacji po utworzeniu indeksu lub przebudowanych.Domyślnie jest wyłączona.

  • STATISTICS_NORECOMPUTE = {ON | OFF }
    Określa, czy są przeliczane statystyk dystrybucji.Domyślnie jest wyłączona.

  • ALLOW_ROW_LOCKS = { na | OFF}
    Określa, czy wiersz blokady są dozwolone.Domyślnie jest włączone.

  • ALLOW_PAGE_LOCKS = { na | OFF}
    Określa, czy dozwolone są strona blokad.Domyślnie jest włączone.

Najważniejsze wskazówki

Jeśli zdefiniowanej przez użytkownika funkcja nie jest tworzony z SCHEMABINDING klauzula, zmiany wprowadzone do podstawowych obiektów można wpływać na definicji funkcja i wygenerować nieoczekiwane wyniki , gdy wywoływana jest.Zaleca się, aby zaimplementować jedną z następujących metod w celu zapewnienia, że funkcja nie staje się nieaktualna z powodu zmiany pod nim obiekty:

  • Podczas tworzenia funkcja, należy określić SCHEMABINDING Z klauzula .Daje to pewność, że obiekty, do których odwołuje się w definicji funkcja nie można modyfikować, chyba że funkcja jest również modyfikowane.

  • Wykonanie sp_refreshsqlmodule procedura składowana po zmodyfikowaniu dowolny obiekt, który jest określona w definicji funkcja.

Typy danych

Jeśli parametry są określone w funkcja CLR, należy je SQL Server Typy zdefiniowane wcześniej dla scalar_parameter_data_type.Aby uzyskać informacje o porównanie SQL Server typów danych do środowiska CLR integracja danych typów lub .NET Framework Zobacz standardowe typy danych języka runtime Mapowanie danych parametru CLR.

Dla SQL Server Aby odwołać się za poprawną metoda podczas jest nadmiernie obciążony w klasie, metoda wskazanych w <method_specifier> musi mieć następujące cechy:

  • Otrzymać taką samą liczbę parametrów, jak określono w [ ,...n ].

  • Otrzymują wszystkie parametry o wartość, a nie przez odwołanie.

  • Użyj typy parametrów, które są zgodne z określonymi w SQL Server funkcja.

Jeśli typ danych zwracanej funkcja CLR określa typ tabela (tabela zwraca), typ zwracanych danych metoda w <method_specifier> powinny być typu IEnumerator lub IEnumerable, i zakłada się, że interfejs jest implementowany przez twórcę funkcja.W przeciwieństwie do Transact-SQL Funkcje, funkcje CLR nie może zawierać klucz podstawowy, unikatowe, lub Sprawdź ograniczenia w <table_type_definition>.Typy danych kolumn określona w <table_type_definition> musi odpowiadać typom odpowiednich kolumn zestaw wyników zwrócony przez metoda <method_specifier> w czaswykonywania.Ten typ kontroli nie jest wykonywane w czas utworzenia funkcja .

Aby uzyskać więcej informacji na temat funkcji CLR program zobacz CLR funkcje zdefiniowane przez użytkownika.

Uwagi ogólne

Wartości skalarnej funkcji można wywołać, gdzie są używane wyrażenia wartość skalarna .Obejmuje to kolumny obliczane i definicje ograniczenie wyboru.Wartości skalarnej funkcji mogą być również wykonywane za pomocą Wykonywanie instrukcja.Można wywołać funkcji skalarnej wyceniane, używając co najmniej dwóch części nazwy funkcja.Aby uzyskać więcej informacji na temat nazw wieloczęściowe zobacz Konwencje składni języka Transact-SQL (Transact-SQL).Funkcje wartościami przechowywanymi w tabeli mogą być wywoływane w przypadku gdy dozwolone wyrażeń tabela w klauzula FROM instrukcji SELECT, INSERT, UPDATE lub DELETE.Aby uzyskać więcej informacji, zobacz Wykonywanie funkcji zdefiniowanej przez użytkownika (aparat bazy danych).

Współdziałanie

Poniższe instrukcje są prawidłowe w funkcja:

  • Instrukcji przypisania.

  • Sprawozdania z kontroli przepływów z wyjątkiem SPRÓBOWAĆ...Zestawień połowowych.

  • ZADEKLAROWAĆ sprawozdania Definiowanie zmiennych lokalnych danych i lokalnych kursory.

  • Wybierz instrukcje, które zawierają listy wybierz z wyrażeniami, które przypisują wartości do zmiennych lokalnych.

  • Operacje kursora odwoływania się do lokalnego kursory, zadeklarowanych, otwarte, zamknięte i w funkcja.Dozwolone są tylko instrukcje pobrania, które przypisywania wartości do zmiennych lokalnych przy użyciu klauzula INTO; POBIERANIE instrukcji, które zwracają dane klient są niedozwolone.

  • Wstawianie, AKTUALIZOWANIE i usuwanie instrukcji Modyfikacja zmiennych lokalnej tabela .

  • Instrukcji EXECUTE wywoływania rozszerzonych procedur przechowywanych.

  • Aby uzyskać więcej informacji, zobacz Tworzenie funkcji zdefiniowanej przez użytkownika (aparat bazy danych).

Współdziałanie kolumny obliczanej

W SQL Server 2005 i później, funkcje mają następujące właściwości.Wartości te właściwości określają, czy funkcje mogą być używane kolumny obliczane, które mogą być utrwalone lub indeksowane.

Właściwość

Opis

Uwagi

IsDeterministic

Funkcja jest firmy Deterministic Networks lub rodzaju.

W funkcjach firmy Deterministic Networks jest dozwolony dostęp do danych lokalnych.Na przykład funkcje, które zawsze zwraca ten sam wynik każdej czas wywołana przy użyciu określonego zestaw wartości wejściowych i z tego samego stanu bazy danych może być oznaczony jako firmy Deterministic Networks.

IsPrecise

Funkcja jest dokładne lub niedokładny.

Funkcje niedokładny zawierają operacje, takie jak operacje ruchomy punkt.

IsSystemVerified

Dokładność i determinism właściwości funkcja mogą zostać sprawdzone przez SQL Server.

 

SystemDataAccess

Funkcja uzyskuje dostęp do danych systemu (katalogi systemu lub wirtualnych tabele systemowe) w lokalnym wystąpienie SQL Server.

 

UserDataAccess

Funkcja uzyskuje dostęp do danych użytkownika w lokalnym wystąpienie SQL Server.

Zawiera tabele zdefiniowane przez użytkownika i tabele tymczasowe, ale nie tabela zmienne.

Właściwości dokładność i determinism Transact-SQL funkcje są określane automatycznie przez SQL Server.Aby uzyskać więcej informacji, zobacz Zdefiniowany przez użytkownika funkcji projekt wytycznych.Właściwości dostępu i determinism danych funkcji środowiska CLR może być określony przez użytkownika.Aby uzyskać więcej informacji, zobacz Omówienie integracji CLR atrybutów niestandardowych.

Aby wyświetlić bieżące wartości tych właściwości, użyj OBJECTPROPERTYEX.

Obliczanej kolumna , która wywołuje zdefiniowanej przez użytkownika funkcja mogą być używane w indeksie podczas zdefiniowanej przez użytkownika funkcja ma następujące wartości właściwość :

  • IsDeterministic= true

  • IsSystemVerified= true (chyba że kolumna obliczana jest trwała)

  • UserDataAccess= false

  • SystemDataAccess= false

Aby uzyskać więcej informacji, zobacz Tworzenie indeksów kolumny obliczanej.

Wywoływanie rozszerzone przechowywane procedury z funkcji

rozszerzona procedura składowana, gdy zostanie wywołana z wewnątrz funkcjanie można zwrócić zestaw wyników do klient.ODS API, które zwracają zestaw wyników do klient będzie zwracać się nie POWIEŚĆ.rozszerzona procedura składowana można podłączyć do wystąpienie SQL Server; Jednak to nie należy próbować łączyć tej samej transakcji jako funkcja wywoływana rozszerzona procedura składowana.

Podobnie jak wywołania z partia lub procedura składowana, rozszerzona procedura składowana zostanie wykonana w kontekście zabezpieczeń konta systemu Windows, w którym SQL Server jest uruchomiony.Właściciel procedura składowana należy wziąć pod uwagę to składając uprawnienie Wykonywanie na nim do użytkowników.

Ograniczenia i ograniczenia

Funkcje zdefiniowane przez użytkownika nie można użyć do wykonywania czynności, które modyfikują stanu bazy danych.

Funkcje zdefiniowane przez użytkownika nie może zawierać dane wyjściowe do klauzula zawierający tabela jako jej miejsce docelowe.

Następujące Service Broker sprawozdania nie zawarte w definicji Transact-SQL przez użytkownika funkcja:

  • ROZPOCZNIJ KONWERSACJĘ OKNO DIALOGOWE

  • KONIEC KONWERSACJI

  • POBIERZ KONWERSACJĘ GRUPY

  • PRZENIEŚĆ KONWERSACJI

  • ODBIERANIE

  • WYŚLIJ

Funkcje zdefiniowane przez użytkownika mogą być zagnieżdżane; oznacza to, że jeden zdefiniowanej przez użytkownika funkcja może wywołać inną.poziom zagnieżdżenia jest zwiększana, gdy wywoływana funkcja rozpoczyna wykonywanie i zmniejszana, gdy wywoływana funkcja zakończy się wykonywanie.Funkcje zdefiniowane przez użytkownika można zagnieździć maksymalnie 32 poziomy.Przekraczającej maksymalne poziomy zagnieżdżania powoduje, że całość wywoływania funkcja łańcucha nie powiedzie się.Wszelkie odniesienia do kod zarządzany z Transact-SQL przez użytkownika funkcja liczy się jako jeden poziom przeciwko 32 -poziom zagnieżdżania limit.Limit ten nie są uwzględniane metody wywoływane z kod zarządzany .

Przy użyciu porządku sortowania w CLR funkcje wartościami przechowywanymi w tabeli

Gdy przy użyciu klauzula ORDER CLR tabela-ważnych funkcji, należy przestrzegać następujących zasad:

  • Należy się upewnić, że wyniki zawsze są uporządkowane w kolejności określonej.Jeśli wyniki nie są w kolejności określonej SQL Server wygeneruje komunikat o błędzie podczas wykonywania kwerendy.

  • Jeżeli określono kolejności klauzula danych wyjściowych tabela-ważnych funkcja musi być sortowane zgodnie z sortowanie kolumna (jawny lub niejawny).Na przykład, jeśli kolumna sortowanie jest chiński (określonych w DDL dla tabela-wycenione funkcja lub otrzymanych od sortowaniebazy danych), otrzymanych wyniki musi być sortowane zgodnie z chińskim sortowania reguł.

  • KOLEJNOŚĆ klauzula, jeśli określony, jest zawsze weryfikowane przez SQL Server podczas zwracania wyniki, czy nie jest używany przez procesor kwerend, aby wykonać dodatkowe optymalizacje.klauzula ORDER należy używać tylko wtedy, jeśli wiadomo, że warto procesor kwerend.

  • SQL Server Procesor kwerend wykorzystuje kolejność klauzula automatycznie w następujących przypadkach:

    • Wstaw kwerendy, w przypadku gdy klauzula ORDER jest zgodny z indeksu.

    • Klauzul ORDER BY zgodnych z klauzulaORDER.

    • Agregaty, gdzie Grupuj według jest zgodne z klauzulaORDER.

    • W przypadku gdy różne kolumny są zgodne z klauzulaORDER DISTINCT agregatów.

klauzula ORDER nie gwarantuje zamówione wyniki podczas wykonywania kwerendy WYBIERAJĄCEJ ORDER BY również określono w kwerendzie.Zobacz sys.function_order_columns (języka Transact-SQL) informacji na temat kwerend kolumn znajdujących się w porządku sortowania dla tabela-wyceniana funkcje.

Metadane

W poniższej tabela wymieniono systemu widoki wykazu , które służy do zwracania metadane dotyczące funkcji zdefiniowanych przez użytkownika.

Wyświetlanie systemu

Opis

sys.sql_modules

Służy do wyświetlania definicji Transact-SQL Funkcje zdefiniowane przez użytkownika.Na przykład:

Definicja funkcji utworzone za pomocą opcji szyfrowania nie można przeglądać za pomocą sys.sql_modules; jednak jest wyświetlane inne informacje na temat funkcji zaszyfrowane.

sys.assembly_modules

Wyświetla informacje na temat funkcji zdefiniowanej przez użytkownika środowiska CLR.

sys.Parameters

Wyświetla informacje dotyczące parametrów zdefiniowanych w funkcji zdefiniowanej przez użytkownika.

sys.sql_expression_dependencies

Wyświetla obiekty podstawowym wywoływanym przez funkcja.

Uprawnienia

Wymaga funkcji tworzenia uprawnienia w bazie danych i ZMIEŃ na schemacie, w którym utworzona funkcja .Jeśli funkcja Określa typ zdefiniowany przez użytkownika, wymaga uprawnienie EXECUTE typu.

Przykłady

A.Za pomocą wartość skalarna-wycenione zdefiniowanej przez użytkownika funkcja , która oblicza tygodnia ISO

W poniższym przykładzie tworzone przez użytkownika funkcja ISOweek.Ta funkcja przyjmuje argument data i oblicza numer tygodnia ISO.Ta funkcja oblicza poprawnie SET DATEFIRST 1 należy wywołać przed funkcja jest wywoływana.

W przykładzie pokazano również za pomocą Wykonywanie jako klauzula , aby określić kontekst zabezpieczeń, w którym można wykonać procedura składowana .W przykładzie opcja CALLER Określa, że procedura będzie wykonywany w kontekście użytkownika, który wywołuje goInne opcje, które można określić są SELF właściciela, a user_name.

W tym miejscu jest wywołanie funkcja .Należy zauważyć, że DATEFIRST jest zestaw na 1.

USE AdventureWorks2008R2;
GO
IF OBJECT_ID (N'dbo.ISOweek', N'FN') IS NOT NULL
    DROP FUNCTION dbo.ISOweek;
GO
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 wewnętrznych tabela-wycenione funkcja

Poniższy przykład zwraca wbudowane tabela-wycenione funkcja.Zwraca trzy kolumny ProductID, Name i wartość zagregowana roku-do-podsumowania nadata przez przechowywanie jako YTD Total dla każdego produktu sprzedawanego do magazynu.

USE AdventureWorks2008R2;
GO
IF OBJECT_ID (N'Sales.ufn_SalesByStore', N'IF') IS NOT NULL
    DROP FUNCTION Sales.ufn_SalesByStore;
GO
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 
    JOIN Sales.SalesOrderDetail AS SD ON SD.ProductID = P.ProductID
    JOIN Sales.SalesOrderHeader AS SH ON SH.SalesOrderID = SD.SalesOrderID
    JOIN Sales.Customer AS C ON SH.CustomerID = C.CustomerID
    WHERE C.StoreID = @storeid
    GROUP BY P.ProductID, P.Name
);
GO

Aby wywołać funkcja, należy uruchomić tę kwerendę.

SELECT * FROM Sales.ufn_SalesByStore (602);

C.Tworzenietabelainstrukcjamulti--wycenione funkcja

Poniższy przykład tworzy tabela-wycenione funkcja fn_FindReports(InEmpID).Gdy podany identyfikator pracownika prawidłowy, funkcja zwraca tabela , która odpowiada wszystkim pracownikom tego raportu do pracownika bezpośrednio lub pośrednio.funkcja używa cykliczne wspólnej tabelawyrażenie (CTE) do wyprodukowania hierarchiczną listę pracowników. Aby uzyskać więcej informacji na temat cykliczne CTEs zobacz Z common_table_expression (języka Transact-SQL).

USE AdventureWorks2008R2;
GO
IF OBJECT_ID (N'dbo.ufn_FindReports', N'TF') IS NOT NULL
    DROP FUNCTION dbo.ufn_FindReports;
GO
CREATE FUNCTION dbo.ufn_FindReports (@InEmpID INTEGER)
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 (
        SELECT e.BusinessEntityID, e.OrganizationNode, p.FirstName, p.LastName, e.JobTitle, 0 -- Get the initial list of Employees for Manager n
        FROM HumanResources.Employee e 
            INNER JOIN Person.Person p 
            ON p.BusinessEntityID = e.BusinessEntityID
        WHERE e.BusinessEntityID = @InEmpID
        UNION ALL
        SELECT e.BusinessEntityID, e.OrganizationNode, p.FirstName, p.LastName, e.JobTitle, RecursionLevel + 1 -- Join recursive member to anchor
        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.Tworzenie funkcja CLR

W poniższym przykładzie założono, że Przykłady aparat bazy danych serweraSQL zainstalowany w lokalizacji domyślnej komputera lokalnego i StringManipulate.csproj skompilowaniu aplikacji przykładowej.Aby uzyskać więcej informacji, zobacz Zagadnienia dotyczące instalowania przykładów i przykładowych baz danych programu SQL Server.

W przykładzie tworzone funkcja CLR len_s.Przed utworzeniem funkcja , wirtualny plik dziennika SurrogateStringFunction.dll jest zarejestrowany w lokalnej bazie danych.

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\MSSQL10_5.MSSQLSERVER\MSSQL\DATA\master.mdf', 'Microsoft SQL Server\90\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

Na przykład utworzyć tabelaCLR-wycenione funkcja, zobacz CLR oródwierszową funkcje.

Historia zmian

Zaktualizowana zawartość

Dodane informacje o zachowaniu w definicji DOMYŚLNEJ po wartość skalarna funkcja jest wywoływany przy użyciu EXECUTE.