Share via


CREATE FUNCTION (Transact-SQL)

Bir kullanıcı tanımlı işlev oluşturur SQL Server 2008 R2.Kullanıcı tanımlı bir işlev olan bir Transact-SQL veya ortak dil çalışma zamanı (clr) yordam parametreleri kabul eder, bir eylemgibi karmaşık bir hesaplama yapar ve o eylem olarak sonucu verirdeğer.Dönüş değeri, skaler (tek) bir değer ya da bir tabloya da olabilir.Bu deyim , bu şekilde kullanılabilecek yeniden kullanılabilir bir yordam oluşturmak için kullanın:

  • De Transact-SQL gibi deyimleri seçin

  • Uygulamalarda işlevçağırma

  • Başka bir kullanıcı tarafından tanımlanan işlevtanımında

  • Görünüm stratejisinin veya dizinli görünümişlevselliği artırmak için

  • Bir tablobir sütun tanımlamak için

  • DENETİM kısıtlamasını bir sütuntanımlamak için

  • saklı yordamdeğiştirmek için

Konu bağlantısı simgesiTransact-SQL sözdizimi kuralları

Sözdizimi

--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 ] )

Bağımsız değişkenler

  • schema_name
    Kullanıcı tanımlı işlev ait olduğu şema addır.

  • function_name
    Kullanıcı tanımlı işlevadıdır.İşlev adları için kuralları ile uymak gerekir tanımlayıcıları ve şeması için ve veritabanı içinde benzersiz olmalıdır.

    Not

    işlev adı sonra bir parametresi belirtilmemiş olsa bile, ayraçlar gereklidir.

  • @parameter_name
    Kullanıcı tanımlı işlevbir parametredir.Bir veya daha fazla parametre bildirilebilir.

    Bir işlev , maksimum 2100 parametreleri olabilir.işlev çalıştırıldığında, bir varsayılan parametre için tanımlanan sürece kullanıcı tarafından bildirilen her parametre değeri sağlanmalıdır.

    Parametre adı kullanarak belirttiğiniz bir at işareti (@) ilk karakteri olarak.Parametre adı tanıtıcı kurallarına uymanız gerekir.işlevparametreleri özeldir; aynı parametre adları diğer işlevleri kullanılabilir.Parametre yerine yalnızca sabitler alabilir; Bunlar, tablo adları, sütun adları veya diğer veritabanı nesnelerinin adlarını yerine kullanılamaz.

    Not

    ANSI_WARNINGS değil ödenen bir saklı yordam, kullanıcı tanımlı işlevparametre iletmek veya size bildirmek ve toplu işdeyimiçinde değişkenleri küme . Örneğin, bir değişken olarak tanımlanır, char(3)ve sonra küme üç karakterden daha büyük bir değere, tanımlanan boyutu ve eklemek için veriler kesildi veya update deyim başarılı.

  • [ type_schema_name. ] parameter_data_type
    Parametre veri türü ve isteğe bağlı olarak ait olduğu şema olur.İçin Transact-SQL İşlevler, kullanıcı tanımlı clr türleri ve kullanıcı tanımlı tablo türleri de dahil olmak üzere tüm veri türleri dışında izin timestamp veri türü.clr işlevleri için dışında clr kullanıcı tanımlı türler de dahil olmak üzere tüm veri türlerine izin verilir text, ntext, image, kullanıcı tanımlı tablo türleri ve timestamp veri türü.Nonscalar türleri, cursor ve table, de parametre veri türü olarak belirtilemez Transact-SQL veya clr işlevleri.

    type_schema_name Belirtilmezse, Veritabanı Altyapısı arar scalar_parameter_data_type aşağıdaki sırayla:

    • Adlarını içeren şema SQL Server Sistem veri türleri.

    • Geçerli veritabanında geçerli kullanıcının varsayılan şema.

    • dbo Şema geçerli veritabanı.

  • [ =default ]
    Bir varsayılan parametre değeridir.Yoksa bir default değeri tanımlanır, için bir değer belirtmeden işlev çalıştırılabilirBu parametre.

    Not

    Varsayılan parametre değerleri için dışında clr işlevleri için belirtilebilir varchar(max) ve varbinary(max) veri türü.

    işlev parametre varsayılan değeri olduğunda varsayılan olmalıdır anahtar işlev varsayılan değerini almak için ne zaman denilen belirtti.Bu davranış, hangi atlama parametresi de varsayılan değer anlaşılacağı saklı yordamlar varsayılan değerleri ile parametrelerini kullanarak farklıdır.Bir Bu davranışın skaler işlev execute deyimkullanarak baþlatýrken istisnadır.execute kullanırken, varsayılan anahtar gerekli değildir.

  • SALT OKUNUR
    Parametresi olamaz güncelleştirilmesi veya işlevtanımı değiştirilmiş olduğunu gösterir.Parametre türü kullanıcı tanımlı tablo türü ise, salt okunur belirtilmelidir.

  • return_data_type
    skaler kullanıcı tanımlı bir işlevdönüş değeridir.İçin Transact-SQL İşlevler, kullanıcı tanımlı clr türleri de dahil olmak üzere tüm veri türleri dışında izin timestamp veri türü.clr işlevleri için dışında clr kullanıcı tanımlı türler de dahil olmak üzere tüm veri türlerine izin verilir text, ntext, image, ve timestamp veri türü.Nonscalar türleri, cursor ve table, ya da bir dönüş veri türü olarak belirtilemez Transact-SQL veya clr işlevleri.

  • function_body
    Belirleyen bir dizi Transact-SQL birlikte bir tablodeğiştirme gibi bir yan etkisi üretmez, ifadeleri değeri işlevtanımlayın.function_bodyyalnızca skaler işlevleri ve çoklu deyimli tablokullanılır-değerli fonksiyonlar.

    skaler işlevleri de function_body bir dizi Transact-SQL ifadeleri, birlikte değerlendirmek için skaler bir değer.

    Çoklu deyimli tablo-değerli fonksiyonlar, function_body bir dizi Transact-SQL deyimlerini tablo doldurmak dönüş değişken.

  • scalar_expression
    skaler değer döndüren skalerişlev belirtir.

  • TABLO
    Belirleyen bir dönüş değeri tablo-değerli işlev bir tabloolduğundan.Yalnızca sabitler ve @local_variables tablogeçirilebilir-değerli fonksiyonlar.

    Satır içi tablo-değerli işlevler, tablo dönüş değeri, tek bir select deyimile tanımlanır.Satır içi işlevler dönüş ilişkili değişkenleri yoktur.

    Çoklu deyimli tablo-değerli fonksiyonlar, @return_variable bir tablo değişkeni değeri işlevdöndürülen satır biriken ve saklamak için kullanılan.@return_variable yalnızca belirtilen Transact-SQL işlevleri için clr işlevleri.

  • select_stmt
    Satır içi tablodönüş değeri tanımlayan select deyim olan-değerli işlev.

  • Sipariş (<order_clause>)
    Sırayı belirler hangi sonuçlar tablodöndürülür-değerli işlev.Bölüm "Kılavuzu üzerinde kullanarak sıralama düzeni," daha fazla bilgi için bkz: Bu konuda daha sonra.

  • DIŞ ad <method_specifier> assembly_name.class_name.method_name
    ' % S'işlevini işlevkullanarak bağlamak için derleme yöntem belirtir.assembly_namebir varolan derleme eşleşmelidir SQL Server üzerinde görünürlük ile geçerli veritabanında.class_namebir geçerli olması SQL Server tanımlayıcısı ve derlemesınıf olarak bulunmalıdır.Sınıf bir dönem kullandığı bir ad alanıyla nitelenmiş ad olup olmadığını (.) ad alanı bölümlerini ayırmak için sınıf adı köşeli ayraçlar kullanılarak sınırlanması gerekir ( []) veya tırnak işaretleri (" ").  method_namebir geçerli olması SQL Server tanımlayıcısı ve belirtilen sınıfa, statik bir yöntem olarak varolması gerekir

    Not

    Varsayılan olarak, SQL Server olamaz yürütmek clr kodu.Oluşturmak, değiştirmek ve ortak dil Çalışma Zamanı Modülü başvuru veritabanı nesnelerini bırakın; Ancak, bunlar başvuran yürütmek olamaz SQL Server olanak kadar clr seçeneği etkin.Bu seçeneği etkinleştirmek için kullanın sp_configure.

  • <table_type_definition> ( { <column_definition> <column_constraint> | <computed_column_definition>} <table_constraint>] ,...n ] )
    tablo veri türünü tanımlayan bir Transact-SQLişlev. bildirim tablo sütun tanımları ve sütun veya tablo kısıtlamaları içerir. tablo içinde birincil dosya grubuher zaman geçer.

  • <clr_table_type_definition > ( { column_namedata_type } [ ,...n ] )
    tablo veri türleri için CLR işlevitanımlar.tablobildirim , yalnızca sütun adları ve veri türleri içerir. tablo içinde birincil dosya grubuher zaman geçer.

<function_option>:: = ve <clr_function_option>:: =

işlev bir veya daha aşağıdaki seçeneklerden birini belirtir.

  • ŞİFRELEME
    Gösterir Veritabanı Altyapısı create FUNCTION deyim özgün metni dönüştürmekobfuscated.Gizleme hile şaka çıkışını herhangi katalog görünümleridoğrudan görülmez.sistem tabloları veya veritabanı dosyalarına erişimi olan kullanıcıların obfuscated metni alınamıyor.Ancak, metin ya da erişim sistem tabloları üzerinden yapabilirsiniz ayrıcalıklı kullanıcılar için kullanılabilir olur DAC bağlantı noktası veya veritabanı dosyalarını doğrudan erişim.Ayrıca, sunucu işleme bir hata ayıklayıcı ekleyebileceğini kullanıcıların özgün yordamı zamanında bellekten alabilirsiniz.Sistem meta verilerverilere erişme hakkında daha fazla bilgi için bkz: Meta veri görünürlük yapılandırma.

    Bu seçenek engel işlev bir parçası olarak yayımlanan SQL Server çoğaltma.Bu seçenek clr işlevler için belirtilemez.

  • EMA BALAMA
    işlev , sıraya başvuran veritabanı nesnelerini bağlı olduğunu belirtir.Ema BALAMA belirtildiğinde, temel işlev tanımı etkileyecek şekilde değiştirilemez.işlev tanımı gerekir önce değiştirilebilir veya değiştirilecek olan nesne bağımlılıkları kaldırmak için bıraktı.

    Yalnızca aşağıdaki eylemlerden biri meydana geldiğinde sıraya başvuran nesnelere işlev bağlama kaldırılır:

    • işlev bırakılır.

    • işlev belirtilmemiş ema BALAMA seçeneği alter deyim kullanılarak değiştirilir.

    Bir işlev , şema yalnızca aşağıdaki koşullar geçerli olduğunda bağlı olabilir:

    • işlev bir Transact-SQLişlev.

    • Kullanıcı tanımlı işlevler ve işlev tarafından başvurulan görünümleri de şemaya bağlı.

    • ' % S'işlevi işlev tarafından başvurulan nesneleri iki bölümü adı kullanarak başvurulur.

    • işlev ve sıraya başvuran nesneler aynı veritabanına aittir.

    • create FUNCTION deyim yürüterek kullanıcı işlev başvuran veritabanı nesnelerini başvurular izni vardır.

  • BOŞ GİRDİ NULL DÖNDÜRÜR | ARANAN boş giriş üzerinde
    Belirtir OnNULLCall öznitelik bir skaler-değerli işlev.Belirtilmezse, varsayılan olarak açık boş girdi olarak ADLANDIRILAN de kullanılmış olur.Başka bir deyişle, işlev gövdesi boş bağımsız değişken olarak geçirilen bile yürütür.

    CLR işleviDÖNDÜRÜR null on null giriş belirtilmemişse, bu gösterir SQL Server aldığı bağımsız değişkenlerden biri olduğunda null, işlevgövdesinde çağırmadan null döndürebilir.Belirtilen ' % s'yöntemi yöntem CLR işlevi , <method_specifier> DÖNDÜRÜR null on null giriş ancak create FUNCTION deyim gösterir adı verilen boş giriş on, create FUNCTION deyim önceliklidir gösteren özel öznitelik zaten.OnNULLCallöznitelik belirtilemez clr tablo-değerli fonksiyonlar.

  • Yan yürütme
    Kullanıcı tanımlı işlev yürütüldüğü güvenlik bağlamını belirtir.Bu nedenle, hangi kullanıcı hesabını kontrol edebilirsiniz SQL Server işlevtarafından başvurulan veritabanı nesnelerinin izinlerini doğrulamak için kullanır.

    Not

    execute as satır içi kullanıcı tanımlı işlevler için belirtilemez.

    Daha fazla bilgi için, bkz. Yan (Transact-SQL) yürütme.

<column_definition >:: =

tablo veri türü tanımlar.bildirim tablo sütun tanımları ve sınırlamaları içerir. clr işlevleri, yalnızca column_name ve data_type belirtilebilir.

  • column_name
    sütun tabloadıdır.Sütun adları tanımlayıcıları için olan kurallara uymak zorunda ve tabloiçinde benzersiz olmalıdır.column_name1 ile 128 karakterden oluşabilir.

  • data_type
    sütun veri türünü belirtir.İçin Transact-SQL İşlevler, tüm veri türleri dahil olmak üzere, clr kullanıcı tanımlı türler dışında izin timestamp.clr işlevleri için dışında clr kullanıcı tanımlı türler de dahil olmak üzere tüm veri türlerine izin verilir text, ntext, image, char, varchar, varchar(max), ve timestamp.Nonscalar türü cursor de sütun veri türü olarak belirtilemez Transact-SQL veya clr işlevleri.

  • VARSAYILANconstant_expression
    Bir değer açıkça bir ekleme sırasında değil sağlandığında sütun için sağlanan değer belirtir.constant_expressionbir sabit, null veya bir sistem işlev değeri olabilir.KİMLİK özelliksahip olanlar dışında tüm sütun varsayılan tanımları uygulanabilir.clr tabloiçin varsayılan belirtilemez-değerli fonksiyonlar.

  • HARMANLAMAcollation_name
    sütun harmanlama belirtir.Belirtilmezse, sütun veritabanının varsayılan harmanlama atanır.Harmanlama adı, bir Windows harmanlama adı veya bir SQL harmanlama adı olabilir.Listesini ve alfabe düzenleri hakkında daha fazla bilgi için bkz: Windows harmanlaması adı (Transact-SQL) ve SQL Server harmanlama adı (Transact-SQL).

    collate yan tümce yalnızca sütunların harmanlamaları değiştirmek için kullanılan char, varchar, nchar, ve nvarchar veri türü.

    collate clr tabloiçin belirtilemez-değerli fonksiyonlar.

  • ROWGUIDCOL
    Yeni sütun , satır genel benzersiz tanımlayıcı sütunolduğunu gösterir.Tek bir uniqueidentifiersütun tablo başına belirlenmiş ROWGUIDCOL sütunolarak.ROWGUIDCOL özellik yalnızca atanabilir bir uniqueidentifier sütun.

    ROWGUIDCOL özellik sütundepolanan değerleri benzersizliğini zorlamaz.Bu da otomatik olarak tabloeklenen yeni satırlar için değerleri oluşturmaz.Her sütuniçin benzersiz değerler oluşturmak için NEWID işlev Insert deyimlerini kullanın.Varsayılan değer belirtilebilir; Ancak, NEWID varsayılan olarak belirtilemez.

  • KİMLİK
    Yeni bir sütun kimlik sütunolup olmadığını gösterir.tabloyeni bir satır eklendiğinde SQL Server ' % s'sütun sütuniçin bir benzersiz, artımlı değer sağlar.Kimlik sütunları tabloiçin benzersiz satır tanımlayıcısı olarak hizmet verecek PRIMARY key kısıtlamaları ile birlikte genellikle kullanılır.KİMLİK özellik atanabilir tinyint, smallint, int, bigint, decimal(p,0), veya numeric(p,0) sütunlar.Her tabloyalnızca bir kimlik sütun oluşturulabilir.Kimlik sütunile ilişkili varsayılanları ve varsayılan kısıtlamalar kullanılamaz.Hem de belirtmek seed ve increment veya hiçbiri.Hiçbiri belirtilmediyse varsayılan (1,1) ' dir.

    clr tabloiçin kimlik belirtilemez-değerli fonksiyonlar.

    • seed
      tabloilk satırı için tamsayı değeridir.

    • increment
      Tamsayı değeri eklemek için seed değeri tabloardışık satırlar için.

<column_constraint >:: = ve < table_constraint>:: =

Belirtilen sütun veya tablokısıtlaması tanımlar.clr işlevler için izin verilen tek kısıtlama türü null olur.Adlandırılmış kısıtlamaları izin verilmez.

  • NULL | NOT NULL
    sütun null değerlere izin verilip verilmediğini belirler.null kesinlikle bir sınırlama değil, ancak yalnızca gibi belirtilen not null.DEĞİL null belirtilemez clr tablo-değerli işlevler.

  • BİRİNCİL ANAHTAR
    benzersiz dizinbelirli bir sütun için varlıkbütünlük zorlar bir sınırlamadır. tablo-değerli kullanıcı tanımlı işlevler, PRIMARY key kısıtlaması oluşturulabilir tablobaşına yalnızca bir sütun .clr tabloiçin birincil anahtar belirtilemez-değerli fonksiyonlar.

  • BENZERSİZ
    Belirtilen sütun veya sütunları benzersiz diziniçin varlıkbütünlük sağlar bir sınırlamadır. Bir tablo , birden çok benzersiz kısıtlamaları olabilir.clr tabloiçin benzersiz belirtilemez-değerli fonksiyonlar.

  • KÜMELENMİŞ | KÜMELENMEMİŞ
    Kümelenmiş veya kümelenmemiş dizin için birincil anahtar veya benzersiz kısıtlama oluşturulduğunu gösterir.PRIMARY key kısıtlamaları clustered ve benzersiz kısıtlamaları nonclustered.

    clustered için yalnızca bir kısıtlama olarak belirtilebilir.clustered için benzersiz kısıtlama belirtilir ve PRIMARY key kısıtlaması da belirtilen birincil anahtar nonclustered kullanır.

    Kümelenmiş ve nonclustered için clr tablobelirtilemez-değerli fonksiyonlar.

  • ONAY
    Bir sütun veya sütunlara girilebilecek olası değerler sınırlayarak etki alanıbütünlük zorlar bir sınırlamadır. DENETLEME kısıtlamaları için clr tablobelirtilemez-değerli fonksiyonlar.

    • logical_expression
      true veya false döndüren mantıksal bir ifade olur.

<computed_column_definition>:: =

Hesaplanmış bir sütunbelirtir.Hesaplanan sütunlar hakkında daha fazla bilgi için bkz: CREATE TABLE (Transact-SQL).

  • column_name
    Hesaplanmış bir sütunaddır.

  • computed_column_expression
    Hesaplanmış bir sütundeğeri tanımlayan bir ifade olur.

<index_option> :: =

BİRİNCİL anahtar veya benzersiz dizin için dizin seçeneklerini belirtir.Dizin seçenekleri hakkında daha fazla bilgi için bkz: CREATE INDEX (Transact-SQL).

  • PAD_INDEX = {ON | OFF }
    Dizin doldurmabelirtir.Varsayılan kapalı'dır.

  • FILLFACTOR =fillfactor
    Nasıl tam olarak gösteren bir yüzdesini belirtir Veritabanı Altyapısı olun yaprak düzey her dizin sayfası sırasında dizin oluşturma veya değiştirme.fillfactor1-100 bir tamsayı değeri olmalıdır.Varsayılan değer 0'dir.

  • IGNORE_DUP_KEY = {ON | OFF }
    Yinelenen anahtar değerleri bir benzersiz dizineklemek INSERT işlemi çalıştığında hata yanıtını belirtir.Dizin oluşturulduğunda veya yeniden sonra işlemleri yalnızca eklemek için IGNORE_DUP_KEY seçeneğini uygular.Varsayılan kapalı'dır.

  • STATISTICS_NORECOMPUTE = {ON | OFF }
    Dağılım istatistiklerini recomputed olup olmadığını belirtir.Varsayılan kapalı'dır.

  • allow_row_locks = { on | OFF}
    Satır kilitleri izin verilip verilmeyeceğini belirtir.Varsayılan açık'tır.

  • allow_page_locks = { on | OFF}
    sayfa kilitlemeleri izin verilip verilmeyeceğini belirtir.Varsayılan açık'tır.

En iyi yöntemler

Kullanıcı tanımlı bir işlev ile yan tümceema BALAMA oluşturulmaz, alttaki nesnelere yapılan değişiklikler tanımı işlev etkiler ve çağrıldığında beklenmeyen sonuçlar ortaya.işlev temel nesneleri değişiklikler nedeniyle güncelliğini yitirmiş değil emin olmak için aşağıdaki yöntemlerden birini uygulamak öneririz:

  • işlevoluştururken yan tümce ile ema BALAMA belirtin.Bu işlev tanımında başvurulan nesneler işlev de değiştirilir sürece değiştirilemez sağlar.

  • Yürütme sp_refreshsqlmodulesonra işlevtanımında belirtilen herhangi bir nesneyi değiştirmeksaklı yordam .

Veri Türleri

CLR işleviparametreleri belirtilirse, olması gereken SQL Server türleri için önceden tanımlanmış gibi scalar_parameter_data_type.Karşılaştırma hakkında bilgi SQL Server clr tümleştirme veri türleri için sistem veri türleri veya .NET Framework ortak dil çalışma zamanı veri türlerini görmek clr parametre verilerini eşleme.

İçin SQL Server için doğru yöntem olduğunda aşırı bir sınıf içinde başvuru yöntem belirtilen içinde <method_specifier> aşağıdaki özelliklere sahip olmalıdır:

  • Aynı sayıda parametre belirtildiği gibi alırsınız [ ,...n ].

  • Değer, başvuru tarafından tüm parametreleri alırsınız.

  • Belirtilen ile uyumlu olan parametre türleri kullanmak SQL Server işlev.

CLR işlevi dönüş veri türü (tablo DÖNDÜRÜR), yöntem dönüş veri türü tablo türünü belirtir, <method_specifier> türünde olmalıdır IEnumerator veya IEnumerable, ve arabirim işlevoluşturan kişi tarafından gerçekleştirilir varsayılır.Aksine Transact-SQL İşlevler, clr işlevleri içeren birincil anahtar, benzersiz, veya kontrol kısıtlamalarını <table_type_definition>.Belirtilen sütun veri türleri <table_type_definition> yöntem tarafından döndürülen sonuç kümesi karşılık gelen sütun türleri eşleşmelidir <method_specifier> yürütme saat.Bu tür denetleme işlev oluşturulan saat gerçekleştirilmez.

Program clr işlevleri hakkında daha fazla bilgi için bkz: clr kullanıcı tanımlı işlevler.

Genel açıklamalar

skaler ifadeler kullanıldığı skalar değerli işlevler çağrılabilir.Bu hesaplanan sütunlar ve onay kısıtlaması tanımlarını içerir.Skalar değerli işlevler de çalıştırılabilir kullanarak execute deyim.Skalar değerli işlevler en az işleviki bölümü adı kullanarak çağrılması gerekir.Çok parçalı adları hakkında daha fazla bilgi için bkz: Transact-SQL Sözdizimi Kuralları (Transact-SQL).from yan tümce select, INSERT, update veya delete deyimleri içinde tablo ifadelere izin burada tablo değerli işlevler çağrılabilir.Daha fazla bilgi için, bkz. Kullanıcı tanımlı işlevler (veritabanı altyapısı) yürütme.

Birlikte çalışabilirlik

Bir işlevaşağıdaki ifadeler geçerlidir:

  • Atama deyimleri.

  • Akış denetimi deyimleri deneyin dışında...catch deyimleri.

  • Yerel veri değişkenleri ve yerel imleçler tanımlayan ifadelerden BİLDİRİN.

  • Yerel değişkenler için değerler atayın ifadeleri ile seçim listelerini içeren deyimleri seçin.

  • İmleç işlemlerini, açılmış, bildirilen yerel imleçler başvuran kapalı ve işlevkaldırıldı.INTO yan tümce kullanarak yerel değişkenler için değerler atayın getirme deyimleri izin verilir; istemci veri verilmeyen dönmek deyimleri GETİR.

  • Ekle, update ve delete deyimlerini yerel tablo değişkenlerini değiştirme.

  • execute deyimlerinin çağırma genişletilmiş saklı yordamları.

  • Daha fazla bilgi için, bkz. Kullanıcı tanımlı işlevler (veritabanı altyapısı) oluşturma.

Hesaplanan sütun birlikte çalışabilirlik

İçinde SQL Server 2005 ve daha sonra işlevler aşağıdaki özellikleri.Bu özelliklerin değerlerini işlevleri kalıcı veya dizinlenmiş Hesaplanmış sütunlarda kullanılabilir olup olmadığını belirler.

Özellik

Açıklama

Notlar

IsDeterministic

Deterministic veya FUNCTION işlevdir.

Yerel veri erişimi, deterministic işlevler izin verilir.Örneğin, her zaman bir özel küme , giriş değerleri kullanılarak çağrılır ve aynı veritabanının durumu ile deterministic etiketli her saat aynı sonucu dönmek işlevleri.

IsPrecise

Kesin veya günümüzdeki işlevdir.

Kayan nokta işlemleri gibi işlemleri günümüzdeki işlevleri içerir.

IsSystemVerified

işlev duyarlık ve determinism özelliklerini, tarafından doğrulanabilecek SQL Server.

 

SystemDataAccess

İşlevi erişir (sistem kataloglar veya sanal sistem tabloları) sistem verilerini yerel örnek SQL Server.

 

UserDataAccess

İşlev erişen kullanıcı verilerini yerel örnek SQL Server.

Kullanıcı tanımlı tablo ve geçici tablolar, ancak tablo değişkenlerini içerir.

Duyarlık ve determinism özelliklerini Transact-SQL işlevleri tarafından otomatik olarak belirlenen SQL Server.Daha fazla bilgi için, bkz. Kullanıcı tanımlı işlev tasarım yönergeleri.clr işlevleri veri erişimi ve determinism özelliklerini, kullanıcı tarafından belirlenebilir.Daha fazla bilgi için, bkz. clr tümleştirme özel öznitelikler genel bakış.

Bu özelliklerin geçerli değerlerini görüntülemek için objectpropertyex.

Kullanıcı tanımlı işlev aşağıdaki özellik değerleri varsa, kullanıcı tanımlı bir işlev çağırır hesaplanmış bir sütun bir dizinde kullanılabilir:

  • IsDeterministic= TRUE

  • IsSystemVerified(hesaplanan sütun kalıcı sürece) = true

  • UserDataAccess= FALSE

  • SystemDataAccess= FALSE

Daha fazla bilgi için, bkz. Dizinler üzerinde hesaplanan sütunlar oluşturma.

Çağırma genişletilmiş saklı yordamları işlevler

Bunu bir işleviçinde çağrıldığı zaman genişletilmiş saklı yordam, istemcisonuç kümeleri döndüremez.Tüm ods istemci sonuç kümeleri döndürür dönmek API başarısız.genişletilmiş saklı yordam geri örnek için bağlantı kurulamadı SQL Server; Ancak, bu birleştirmek aynı hareket genişletilmiş saklı yordamçağrılan işlev denememelisiniz.

Benzer şekilde çağırmaları toplu iş veya saklı yordam, genişletilmiş saklı yordam Windows güvenlik hesabı bağlamında yürütülür SQL Server çalışmaktadır.saklı yordam sahibi bu execute izni üzerinde kullanıcılara yaparken göz önünde bulundurmalısınız.

Sınırlamalar ve kısıtlamalar

Kullanıcı tanımlı işlevler, veritabanı durumunu değiştir eylemleri gerçekleştirmek için kullanılamaz.

Kullanıcı tanımlı işlevler, hedefolarak bir tablo içeren bir çıkış INTO yan tümce içeremez.

Aşağıdaki Service Broker ifadeleri tanımında eklenebilir edilemez bir Transact-SQL kullanıcı tanımlı işlev:

  • BAŞLANGIÇ İLETİŞİM KONUŞMA

  • SON KONUŞMA

  • GET KONUŞMA GRUBU

  • MOVE KONUŞMA

  • ALMA

  • GÖNDER

Kullanıcı tanımlı işlevler iç içe olabilir; yani, bir kullanıcı tanımlı işlev başka çağırabilirsiniz.Çağrılan işlev yürütme başladığında, iç içe geçmiş düzey artırılır ve çağrılan işlev yürütme tamamlandığında indirildiği düğümlerde.Kullanıcı tanımlı işlevler 32 düzeye kadar iç içe olabilir.İç içe geçmiş nedenleri maksimum düzeyde vermesine işlev zinciri çağırma bütün aşan.yönetilen kod referans bir Transact-SQL kullanıcı tanımlı işlev sayar 32 - karşı bir düzey sınırı. iç içe geçmişdüzeyyönetilen kod içinde açılmak istenen yöntemleri bu sınırınızı sayılmaz.

clr tablo değerli işlevler sıralama düzeni kullanma

Sipariş yan tümce clr tablokullanırken-valued İşlevler, şu yönergeleri izleyin:

  • Bu sonuçlar her zaman belirtilen sırada sipariş emin olmanız gerekir.sonuçlar belirtilen sırada değilseniz, SQL Server sorgu çalıştırıldığında hata iletisi oluşturacaktır.

  • Sipariş yan tümce belirtilirse, tabloçıktı- harmanlama sütun (doğrudan ya da dolaylı) göre değerli işlev sıralanmış.Örneğin, sütun harmanlama Çince ise ( DDL tabloiçin belirtilen-değerli işlev veya veritabanı harmanlamaedindiğiniz), alınan sonuçlar sıralama kuralları Çince göre sıralanması gerekir.

  • Belirtilmişse, sipariş yan tümce, her zaman tarafından doğrulanır SQL Server olsun veya olmasın gerçekleştirmek query processor tarafından kullanılır sonuçlar, dönme sırasındadaha fazla iyileştirme.Sorgu işlemci için yararlı olduğunu biliyorsanız yalnızca sipariş yan tümce kullanın.

  • SQL Server Sorgu işlemci yararlanır yan tümce sipariş otomatik olarak aşağıdaki durumlarda:

    • Sipariş yan tümce bir dizin ile uyumlu olduğu sorguları yerleştirin.

    • Sipariş yan tümceile uyumlu olan order by yan tümceleri.

    • group by ile sipariş yan tümceuyumlu olduğu toplar.

    • DISTINCT toplamları ayrı sütunların SIRASI yan tümceile uyumlu olduğu.

SEÇME sorgusu yürütüldüğünde, order by de sorguda belirtilmediği sürece yan tümce sipariş sipariş edilen sonuçlar garanti etmez.Bkz: sys.function_order_columns (Transact-SQL) sorgulamak için sıralama düzeni tablodahil sütunları hakkında bilgi-değerli fonksiyonlar.

Meta veri

Aşağıdaki tablo , kullanıcı tanımlı işlevler hakkında meta veriler dönmek için kullanabileceğiniz Sistem katalog görünümleri listeler.

Sistem görünümü

Açıklama

sql_dependencies

Tanımını görüntüler Transact-SQL kullanıcı tanımlı işlevler.Örneğin:

ŞİFRELEME seçeneğini kullanarak oluşturduğunuz işlevleri tanımını kullanarak görüntülenemez sys.sql_modules; Ancak, şifreli işlevleri hakkında diğer bilgiler görüntülenir.

sys.assembly_modules

clr kullanıcı tanımlı işlevler hakkında bilgi görüntüler.

sys.Parameters

Kullanıcı tanımlı işlevler tanımlanan parametreleri hakkında bilgi görüntüler.

sys.sql_expression_dependencies

Bir işlevtarafından başvurulan alttaki nesneleri görüntüler.

İzinler

create FUNCTION izni veritabanında ve işlev oluşturulmaktadır şema üzerinde alter izni gerektirir.işlev bir kullanıcı tanımlı türbelirtiyorsa, türü üzerinde execute izni gerektirir.

Örnekler

A.Bir skalerkullanarak-değerli ISO hafta hesaplayan kullanıcı tanımlı işlev

Aşağıdaki örnek, kullanıcı tanımlı işlevoluştururISOweek. Bu işlev , tarih bir baðýmsýz deðiþken alýr ve ISO hafta numarası hesaplar.Doğru olarak hesaplamak bu işlev SET DATEFIRST 1 işlev çağrılmadan önce çağrılması gerekir.

Örnek de kullanarak gösterir execute as, saklı yordam çalıştırılabilir güvenlik bağlamı belirtmek içinyan tümce . Örnekte, seçenek CALLER , yordam yürütülür it. çağıran kullanıcı bağlamında belirtirKENDİNDEN, sahibi, belirtebileceğiniz bir seçenek olan ve user_name.

işlev çağrısı İşte.Dikkat DATEFIRST olan küme 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';

Sonuç kümesi buradadır.

ISO Week

----------------

52

B.Satır içi tablooluşturma-değerli işlev

Aşağıdaki örnek verir satır içi tablo-değerli işlev.Üç sütun döndürür ProductID, Name ve toplu yılın-için-tarih toplamları ile deposu olarak YTD Total deposu satılan her ürün için

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

işlevçağırmak için bu sorguyu çalıştırın.

SELECT * FROM Sales.ufn_SalesByStore (602);

C.Multi -deyim tablooluşturma-değerli işlev

Aşağıdaki örnek tablooluşturur-değerli işlev fn_FindReports(InEmpID).Geçerli çalışanın kimliği ile sağlanan tüm çalışanlara doğrudan veya dolaylı olarak bu raporun çalışana karşılık gelen tablo işlev döndürür.işlev bir özyinelemeli ortak tabloifade (cte) hiyerarşik çalışanlar listesi oluşturmak için kullanır. Özyinelemeli CTEs hakkında daha fazla bilgi için bkz: Common_table_expression (Transact-SQL) ile.

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.CLR işlevioluşturma

Aşağıdaki örnek varsayar SQL Server veritabanı altyapısı örneklerini yerel bilgisayar ve örnek uygulama derlenmiş StringManipulate.csproj varsayılan konuma yüklenir.Daha fazla bilgi için, bkz. SQL Server Örnekleri ve Örnek Veritabanlarının Yüklenmesiyle İlgili Önemli Noktalar.

CLR işleviörnek oluştururlen_s. Önce derleme işlev oluşturulurSurrogateStringFunction.dll kayıtlı yerel veritabanı.

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

Bir clr tablooluşturma örneği için-değerli işlevgörmek clr tablo değerli işlevler.

Değişiklik Geçmişi

Güncelleştirilmiş içerik

execute kullanarak skaler işlev çalıştırıldığında varsayılan tanımında davranış bilgileri eklendi.