Aracılığıyla paylaş


FONKSIYON OLUŞTUR (Transact-SQL)

Şunlar için geçerlidir:SQL ServerAzure SQL VeritabanıAzure SQL Yönetilen ÖrneğiMicrosoft Fabric'te SQL veritabanı

Bir Transact-SQL veya ortak dil çalışma zamanı (CLR) yordamı olan kullanıcı tanımlı bir işlev (UDF) oluşturur. Kullanıcı tanımlı bir işlev parametreleri kabul eder, karmaşık hesaplama gibi bir eylem gerçekleştirir ve bu eylemin sonucunu bir değer olarak döndürür. Döndürülen değer skaler (tek) bir değer veya bir tablo olabilir.

Şu yollarla kullanılabilecek yeniden kullanılabilir bir T-SQL yordamı oluşturmak için kullanın CREATE FUNCTION :

  • Gibi Transact-SQL ifadelerde SELECT
  • İşlevi çağıran uygulamalarda
  • Başka bir kullanıcı tanımlı fonksiyonun tanımında
  • Bir görünümü parametreleştirmek veya dizine alınmış bir görünümün işlevselliğini geliştirmek için
  • Tabloda bir sütun tanımlamak için
  • Bir sütunda kısıtlama CHECK tanımlamak için
  • Saklı yordamı değiştirmek için
  • Satır içi işlevi bir güvenlik ilkesi için filtre koşulu olarak kullanma

.NET Framework CLR'nin SQL Server ile tümleştirilmesi bu makalede ele alınmıştır. CLR tümleştirmesi Azure SQL Veritabanı için geçerli değildir.

Note

Microsoft Fabric Veri Ambarı veya Azure Synapse Analytics için bkz. CREATE FUNCTION (Azure Synapse Analytics ve Microsoft Fabric).

Tip

Bu adla yeni bir işlev oluşturulmuyorsa yeni bir işlev oluşturmayı belirtebilir CREATE OR ALTER FUNCTION veya var olan bir işlevi tek bir deyimde değiştirebilirsiniz.

Transact-SQL söz dizimi kuralları

Syntax

Transact-SQL skaler fonksiyonlar için sözdizimi.

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
[ ; ]

Satır içi tablo değerli işlevler için Transact-SQL sözdizimi.

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

Çok deyimli tablo değerli işlevler Transact-SQL için sözdizimi.

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
[ ; ]

Transact-SQL işlev yan tümceleri için sözdizimi.

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

CLR skaler işlevleri için sözdizimi.

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>
[ ; ]

CLR tablo değerli işlevler için sözdizimi.

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>
[ ; ]

CLR işlev yan tümceleri için sözdizimi.

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

Yerel olarak derlenmiş, skaler kullanıcı tanımlı işlevler için bellek içi OLTP sözdizimi.

CREATE [ OR ALTER ] FUNCTION [ schema_name. ] function_name
 ( [ { @parameter_name [ AS ] [ type_schema_name. ] parameter_data_type
    [ NULL | NOT NULL ] [ = default ] [ READONLY ] }
    [ , ...n ]
  ]
)
RETURNS return_data_type
     WITH <function_option> [ , ...n ]
    [ AS ]
    BEGIN ATOMIC WITH (set_option [ , ... n ] )
        function_body
        RETURN scalar_expression
    END

<function_option> ::=
{
  |  NATIVE_COMPILATION
  |  SCHEMABINDING
  | [ EXECUTE_AS_Clause ]
  | [ RETURNS NULL ON NULL INPUT | CALLED ON NULL INPUT ]
}

Arguments

VEYA ALTER

Şunlar için geçerlidir: SQL Server 2016 (13.x) SP 1 ve sonraki sürümleri ve Azure SQL Veritabanı.

İşlevi yalnızca zaten varsa koşullu olarak değiştirir.

SQL Server 2016 (13.x) SP 1 CU 1'den başlayarak CLR için isteğe bağlı OR ALTER sözdizimi kullanılabilir.

schema_name

Kullanıcı tanımlı işlevin ait olduğu şemanın adı.

function_name

Kullanıcı tanımlı işlevin adı. İşlev adları, tanımlayıcılar için kurallara uygun olmalı ve veritabanı içinde ve şeması için benzersiz olmalıdır.

Bir parametre belirtilmemiş olsa bile işlev adından sonra parantezler gereklidir.

@parameter_name

Kullanıcı tanımlı işlevdeki bir parametre. Bir veya daha fazla parametre bildirilebilir.

Bir fonksiyon en fazla 2.100 parametreye sahip olabilir. Bildirilen her parametrenin değeri, parametre için bir varsayılan tanımlanmadığı sürece, işlev yürütüldüğünde kullanıcı tarafından sağlanmalıdır.

İlk karakter olarak @ işareti kullanarak bir parametre adı belirtin. Parametre adı, tanımlayıcılar için kurallara uygun olmalıdır. Parametreler işlev için yereldir; Aynı parametre adları diğer işlevlerde de kullanılabilir. Parametreler yalnızca sabitlerin yerini alabilir; Tablo adları, sütun adları veya diğer veritabanı nesnelerinin adları yerine kullanılamazlar.

ANSI_WARNINGS saklı yordamda, kullanıcı tanımlı işlevde parametreleri geçirdiğinizde veya bir batch deyiminde değişkenleri bildirip ayarladığınızda kabul edilmez. Örneğin, bir değişken karakter(3) olarak tanımlanırsa ve üç karakterden büyük bir değere ayarlanırsa, veriler tanımlanan boyuta yuvarlanır ve INSERT veya UPDATE deyimi başarılı olur.

[ type_schema_name. ] parameter_data_type

Parametre veri türü ve isteğe bağlı olarak ait olduğu şema. Transact-SQL işlevler için, CLR kullanıcı tanımlı türler ve kullanıcı tanımlı tablo türleri de dahil olmak üzere tüm veri türlerine, zaman damgası veri türü dışında izin verilir. CLR işlevleri için, metin, ntext, görüntü, kullanıcı tanımlı tablo türleri ve zaman damgası veri türleri dışında CLR kullanıcı tanımlı türler de dahil olmak üzere tüm veri türlerine izin verilir. Skaler olmayan türler, imleç ve tablo, Transact-SQL veya CLR işlevlerinde parametre veri türü olarak belirtilemez.

type_schema_name belirtilmezse, Veritabanı Altyapısı aşağıdaki sırayla öğesini scalar_parameter_data_type arar:

  • SQL Server sistem veri türlerinin adlarını içeren şema.
  • Geçerli veritabanındaki geçerli kullanıcının varsayılan şeması.
  • Geçerli veritabanındaki dbo şeması.

[ = varsayılan ]

Parametre için varsayılan değer. Varsayılan bir değer tanımlanırsa, işlev bu parametre için bir değer belirtilmeden yürütülebilir.

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

İşlevin bir parametresi varsayılan bir değere sahip olduğunda, varsayılan değeri almak için işlev çağrıldığında anahtar sözcüğün DEFAULT belirtilmesi gerekir. Bu davranış, parametrenin atlanmasının aynı zamanda varsayılan değeri de ima ettiği saklı yordamlarda parametrelerin varsayılan değerlerle kullanılmasından farklıdır. Ancak, deyimi DEFAULT kullanarak EXECUTE skaler bir işlev çağrılırken anahtar sözcük gerekli değildir.

READONLY

Parametrenin işlevin tanımı içinde güncelleştirilemeyeceğini veya değiştirilemeyeceğini gösterir. READONLY kullanıcı tanımlı tablo türü parametreleri (TVP) için gereklidir ve başka bir parametre türü için kullanılamaz.

return_data_type

Skaler kullanıcı tanımlı bir işlevin dönüş değeri. Transact-SQL işlevler için, CLR kullanıcı tanımlı türler de dahil olmak üzere zaman damgası veri türü dışındaki tüm veri türlerine izin verilir. CLR işlevleri için, metin, ntext, görüntü ve zaman damgası veri türleri dışında CLR kullanıcı tanımlı türler de dahil olmak üzere tüm veri türlerine izin verilir. Skaler olmayan türler, imleç ve tablo, Transact-SQL veya CLR işlevlerinde dönüş veri türü olarak belirtilemez.

function_body

Birlikte bir tabloyu değiştirmek gibi bir yan etki oluşturmayan bir dizi Transact-SQL deyiminin işlevin değerini tanımladığını belirtir. function_body yalnızca skaler fonksiyonlarda ve çok deyimli tablo değerli fonksiyonlarda (MSTVF) kullanılır.

Skaler fonksiyonlarda function_body, birlikte skaler bir değer olarak değerlendirilen bir dizi Transact-SQL deyimidir.

MSTVF'lerde function_body , bir TABLE dönüş değişkenini dolduran bir dizi Transact-SQL deyimidir.

scalar_expression

Skaler fonksiyonun döndürdüğü skaler değeri belirtir.

TABLE

Tablo değerli işlevin (TVF) döndürülen değerinin bir tablo olduğunu belirtir. TVF'lere yalnızca sabitler ve @local_variables geçirilebilir.

Satır içi TVF'lerde, TABLE dönüş değeri tek SELECT bir deyim aracılığıyla tanımlanır. Satır içi işlevlerin ilişkili dönüş değişkenleri yoktur.

Çok deyimli tablo değerli işlevlerde (MSTVFs), @return_variable işlevin değeri olarak döndürülmesi gereken satırları depolamak ve biriktirmek için kullanılan bir TABLE değişkendir. @ return_variable yalnızca Transact-SQL işlevler için belirtilebilir, CLR işlevleri için belirtilemez.

select_stmt

Satır içi tablo değerli bir işlevin (TVF) dönüş değerini tanımlayan tek SELECT deyim.

SIPARIŞ (<order_clause>)

Tablo değerli işlevden sonuçların döndürülme sırasını belirtir. Daha fazla bilgi için, bu makalenin devamında yer alan CLR tablo değerli işlevlerde sıralama düzenini kullanma bölümüne bakın.

DIŞ ADI <method_specifier>assembly_name.class_name. method_name

Şunlar için geçerlidir: SQL Server 2008 (10.0.x) SP 1 ve sonraki sürümleri.

Oluşturulan işlev adının başvuracağı derlemeyi ve yöntemi belirtir.

  • assembly_name - sütunundaki bir değerle name eşleşmelidir SELECT * FROM sys.assemblies;.

    İfadede CREATE ASSEMBLY kullanılan ad.

  • class_name - sütunundaki bir değerle assembly_name eşleşmelidir SELECT * FROM sys.assembly_modules;.

    Değer genellikle katıştırılmış bir nokta veya nokta içerir. Bu gibi durumlarda, Transact-SQL sözdizimi, değerin bir çift köşeli parantez ([]) veya bir çift çift tırnak işareti ("") ile sınırlanmasını gerektirir.

  • method_name - sütunundaki method_namebir değerle SELECT * FROM sys.assembly_modules; eşleşmelidir.

    Yöntem statik olmalıdır.

için tüm türlerin MyFood.dll ad alanında olduğu tipik bir örnekteMyFood, EXTERNAL NAME değer şu MyFood.[MyFood.MyClass].MyStaticMethodşekilde olabilir: .

Varsayılan olarak, SQL Server CLR kodunu yürütemez. Ortak dil çalışma zamanı modüllerine başvuran veritabanı nesneleri oluşturabilir, değiştirebilir ve bırakabilirsiniz. Ancak, clr etkin seçeneğini etkinleştirene kadar bu başvuruları SQL Server'da yürütemezsiniz. Bu seçeneği etkinleştirmek için sp_configure kullanın. Bu seçenek, kapsanan bir veritabanında kullanılamaz.

< > table_type_definition ( { column_definition<>< column_constraint | <> computed_column_definition } [ <table_constraint> ] [ , ... n ] )

Bir Transact-SQL işlevi için tablo veri türünü tanımlar. Tablo bildirimi, sütun tanımlarını ve sütun veya tablo kısıtlamalarını içerir. Tablo her zaman birincil dosya grubuna yerleştirilir.

< > clr_table_type_definition ( { column_namedata_type } [ , ... n ] )

Şunlar için geçerlidir: SQL Server 2008 (10.0.x) SP 1 ve sonraki sürümleri ve Azure SQL Veritabanı (bazı bölgelerde önizleme).

Bir CLR işlevi için tablo veri türlerini tanımlar. Tablo bildirimi yalnızca sütun adlarını ve veri türlerini içerir. Tablo her zaman birincil dosya grubuna yerleştirilir.

NULL | NOT NULL

Yalnızca yerel olarak derlenmiş, skaler kullanıcı tanımlı işlevler için desteklenir. Daha fazla bilgi için bkz: In-Memory OLTP için Skaler User-Defined İşlevleri.

NATIVE_COMPILATION

Kullanıcı tanımlı bir işlevin yerel olarak derlenip derlenmediğini gösterir. Bu bağımsız değişken, yerel olarak derlenmiş, skaler kullanıcı tanımlı işlevler için gereklidir.

ATOMIK ILE BAŞLAYIN

Yerel olarak derlenmiş skaler kullanıcı tanımlı işlevler için gereklidir ve yalnızca desteklenir. Daha fazla bilgi için bkz: Yerel Yordamlarda Atomik Bloklar.

SCHEMABINDING

Bağımsız SCHEMABINDING değişken, yerel olarak derlenmiş, skaler kullanıcı tanımlı işlevler için gereklidir.

OLARAK ÇALIŞTIR

EXECUTE AS yerel olarak derlenmiş, skaler kullanıcı tanımlı işlevler için gereklidir.

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

İşlevin aşağıdaki seçeneklerden bir veya daha fazlasına sahip olduğunu belirtir.

ENCRYPTION

Şunlar için geçerlidir: SQL Server 2008 (10.0.x) SP 1 ve sonraki sürümleri.

Veritabanı Altyapısı'nın deyimin CREATE FUNCTION özgün metnini karmaşık bir biçime dönüştürdüğünü gösterir. Gizleme çıktısı hiçbir katalog görünümünde doğrudan görünmez. Sistem tablolarına veya veritabanı dosyalarına erişimi olmayan kullanıcılar, karartılmış metni alamaz. Bununla birlikte, metin, veritabanı yöneticileri için Tanılama bağlantısı üzerinden sistem tablolarına erişebilen veya veritabanı dosyalarına doğrudan erişebilen ayrıcalıklı kullanıcılar tarafından kullanılabilir. Ayrıca, sunucu işlemine bir hata ayıklayıcı ekleyebilen kullanıcılar, çalışma zamanında özgün yordamı bellekten alabilir. Sistem meta verilerine erişme hakkında daha fazla bilgi için bkz: Meta Veri Görünürlüğü Yapılandırması.

Bu seçeneğin kullanılması, işlevin SQL Server çoğaltmasının bir parçası olarak yayımlanmasını engeller. Bu seçenek CLR işlevleri için belirtilemez.

SCHEMABINDING

İşlevin, başvurduğu veritabanı nesnelerine bağlı olduğunu belirtir. Belirtildiğinde SCHEMABINDING , temel nesneler işlev tanımını etkileyecek şekilde değiştirilemez. Değiştirilecek nesneye olan bağımlılıkları kaldırmak için önce işlev tanımının kendisi değiştirilmeli veya bırakılmalıdır.

İşlevin başvurduğu nesnelere bağlanması, yalnızca aşağıdaki eylemlerden biri gerçekleştiğinde kaldırılır:

  • İşlev bırakılır.
  • İşlev, belirtilmemiş seçeneğiyle ALTERSCHEMABINDING deyim kullanılarak değiştirilir.

Bir işlev, yalnızca aşağıdaki koşullar doğruysa şemaya bağlı olabilir:

  • İşlev bir Transact-SQL işlevidir.
  • İşlev tarafından başvurulan kullanıcı tanımlı işlevler ve görünümler de şemaya bağlıdır.
  • İşlev tarafından başvurulan nesnelere iki bölümlü bir ad kullanılarak başvurulur.
  • İşlev ve başvurduğu nesneler aynı veritabanına aittir.
  • Deyimi yürüten CREATE FUNCTION kullanıcı, işlevin başvurduğu veritabanı nesneleri üzerinde izne sahiptir REFERENCES .

NULL GIRIŞTE NULL DÖNDÜRÜR | NULL GIRIŞTE ÇAĞRILDI

Skaler bir fonksiyonun özniteliğini OnNULLCall belirtir. Belirtilmezse, CALLED ON NULL INPUT varsayılan olarak ima edilir. Başka bir deyişle, işlev gövdesi bir argüman olarak iletilse NULL bile yürütülür.

Bir CLR işlevinde belirtilirseRETURNS NULL ON NULL INPUT, SQL Server'ın aldığı NULLbağımsız değişkenlerden herhangi biri olduğunda işlevin gövdesini gerçekten çağırmadan dönebileceğini NULL gösterir. 'de <method_specifier> belirtilen bir CLR işlevinin yöntemi zaten 'i belirten RETURNS NULL ON NULL INPUTözel bir özniteliğe sahipse, ancak deyim 'yi CREATE FUNCTION belirtiyorsa CALLED ON NULL INPUT, deyimi CREATE FUNCTION önceliklidir. CLR OnNULLCall tablo değerli işlevler için öznitelik belirtilemez.

OLARAK ÇALIŞTIR

Kullanıcı tanımlı işlevin yürütüldüğü güvenlik bağlamını belirtir. Bu nedenle, SQL Server'ın işlev tarafından başvurulan herhangi bir veritabanı nesnesindeki izinleri doğrulamak için hangi kullanıcı hesabını kullandığını denetleyebilirsiniz.

EXECUTE AS Satır içi tablo değerli işlevler için belirtilemez.

Daha fazla bilgi için bkz: EXECUTE AS Yan Tümcesi (Transact-SQL).

SATIR İÇİ = { AÇIK | KAPALI }

Şunlar için geçerlidir: SQL Server 2019 (15.x) ve sonraki sürümler ve Azure SQL Veritabanı.

Bu skaler UDF'nin satır içi olup olmayacağını belirtir. Bu yan tümce yalnızca skaler kullanıcı tanımlı işlevler için geçerlidir. INLINE maddesi zorunlu değil. Yan INLINE tümce belirtilmezse, otomatik olarak UDF'nin satır içi olup olmadığına bağlı olarak ayarlanır veya ON buna bağlı olarak ayarlanırOFF. Belirtilirse ancak UDF'nin satır içi olmadığı bulunursa INLINE = ON , bir hata atılır. Daha fazla bilgi için bkz. Scalar UDF Inlining.

< > column_definition ::=

Tablo veri türünü tanımlar. Tablo bildirimi, sütun tanımlarını ve kısıtlamaları içerir. CLR işlevleri için yalnızca column_name ve data_type belirtilebilir.

column_name

Tablodaki bir sütunun adı. Sütun adları, tanımlayıcı kurallarına uygun olmalı ve tabloda benzersiz olmalıdır. column_name 1 ile 128 karakter arasında olabilir.

data_type

Sütun veri türünü belirtir. Transact-SQL işlevler için, CLR kullanıcı tanımlı türler de dahil olmak üzere zaman damgası dışında tüm veri türlerine izin verilir. CLR işlevleri için, CLR kullanıcı tanımlı türler de dahil olmak üzere metin, ntext, image, char, varchar, varchar(max) ve zaman damgası dışındaki tüm veri türlerine izin verilir. Skaler olmayan tür imleci , Transact-SQL veya CLR işlevlerinde sütun veri türü olarak belirtilemez.

VARSAYILT constant_expression

Ekleme sırasında açıkça bir değer sağlanmayan sütun için sağlanan değeri belirtir. constant_expression bir sabit, NULLveya bir sistem işlevi değeridir. DEFAULT Tanımlar IDENTITY , özelliğe sahip olanlar dışında herhangi bir sütuna uygulanabilir. DEFAULT CLR tablo değerli işlevler için belirtilemez.

HARMANLAMA collation_name

Sütun için harmanlamayı belirtir. Belirtilmezse, sütuna veritabanının varsayılan harmanlaması atanır. Harmanlama adı bir Windows harmanlama adı veya SQL harmanlama adı olabilir. Harmanlamaların listesi ve daha fazla bilgi için bkz: Windows Harmanlama Adı (Transact-SQL) ve SQL Server Harmanlama Adı (Transact-SQL).

Yan COLLATE tümce, yalnızca char, varchar, nchar ve nvarchar veri türlerinin sütunlarının harmanlamalarını değiştirmek için kullanılabilir. COLLATE CLR tablo değerli işlevler için belirtilemez.

ROWGUIDCOL

Yeni sütunun bir satır genel benzersiz tanımlayıcı sütunu olduğunu gösterir. Tablo başına yalnızca bir uniqueidentifier sütunu sütun olarak ROWGUIDCOL atanabilir. Özellik ROWGUIDCOL yalnızca bir uniqueidentifier sütununa atanabilir.

Özellik ROWGUIDCOL , sütunda depolanan değerlerin benzersizliğini zorlamaz. Ayrıca, tabloya eklenen yeni satırlar için otomatik olarak değer oluşturmaz. Her sütun için benzersiz değerler oluşturmak için, deyimlerde işlevini NEWID kullanınINSERT. Varsayılan bir değer belirtilebilir; Ancak, NEWID varsayılan olarak belirtilemez.

IDENTITY

Yeni sütunun bir kimlik sütunu olduğunu gösterir. Tabloya yeni bir satır eklendiğinde, SQL Server sütun için benzersiz, artımlı bir değer sağlar. Kimlik sütunları genellikle tablonun benzersiz satır tanımlayıcısı olarak görev yapmak üzere kısıtlamalarla PRIMARY KEY birlikte kullanılır. Özellik IDENTITYtinyint, smallint, int, bigint, decimal(p,0) veya numeric(p,0) sütunlara atanabilir. Tablo başına yalnızca bir kimlik sütunu oluşturulabilir. İlişkili varsayılanlar ve DEFAULT kısıtlamalar bir kimlik sütunuyla kullanılamaz. Hem çekirdeği hem de artışı belirtmeniz veya hiçbirini belirtmemeniz gerekir. Hiçbiri belirtilmezse, varsayılan değer (1,1) olur.

IDENTITY CLR tablo değerli işlevler için belirtilemez.

seed

Tablodaki ilk satıra atanacak tamsayı değeri.

increment

Tablodaki ardışık satırlar için çekirdek değere eklenecek tamsayı değeri.

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

Belirtilen sütun veya tablo için kısıtlamayı tanımlar. CLR işlevleri için izin verilen tek kısıtlama türü şudur: NULL. Adlandırılmış kısıtlamalara izin verilmez.

NULL | NOT NULL

Sütunda boş değerlere izin verilip verilmeyeceğini belirler. NULL kesinlikle bir kısıtlama değildir, ancak aşağıdaki gibi NOT NULLbelirtilebilir: . NOT NULL CLR tablo değerli işlevler için belirtilemez.

BİRİNCİL ANAHTAR

Benzersiz bir dizin aracılığıyla belirtilen bir sütun için varlık bütünlüğünü zorlayan bir kısıtlama. Tablo değerli kullanıcı tanımlı işlevlerde, PRIMARY KEY kısıtlama tablo başına yalnızca bir sütunda oluşturulabilir. PRIMARY KEY CLR tablo değerli işlevler için belirtilemez.

UNIQUE

Benzersiz bir dizin aracılığıyla belirtilen sütun veya sütunlar için varlık bütünlüğü sağlayan kısıtlama. Bir tablonun birden çok UNIQUE kısıtlaması olabilir. UNIQUE CLR tablo değerli işlevler için belirtilemez.

KÜMELENDİ | KÜMELENMİDİ

veya PRIMARY KEY kısıtlaması için kümelenmiş veya kümelenmemiş bir dizin oluşturulduğunu UNIQUE belirtin. PRIMARY KEY Kısıtlamalar kullanır CLUSTEREDve UNIQUE kısıtlamalar kullanır NONCLUSTERED.

CLUSTERED yalnızca bir kısıtlama için belirtilebilir. Bir CLUSTEREDUNIQUE kısıtlama için belirtilmişse ve bir PRIMARY KEY kısıtlama da belirtilmişse, PRIMARY KEY kullanır NONCLUSTERED.

CLUSTERED ve NONCLUSTERED CLR tablo değerli işlevler için belirtilemez.

CHECK

Bir sütuna veya sütunlara girilebilen olası değerleri sınırlayarak etki alanı bütünlüğünü zorlayan bir kısıtlama. CHECK CLR tablo değerli işlevler için kısıtlamalar belirtilemez.

logical_expression

veya TRUEdöndüren FALSE mantıksal bir ifade.

< > computed_column_definition ::=

Hesaplanan sütunu belirtir. Hesaplanan sütunlar hakkında daha fazla bilgi için bkz: CREATE TABLE (Transact-SQL).

column_name

Hesaplanan sütunun adı.

computed_column_expression

Hesaplanan sütunun değerini tanımlayan ifade.

< > index_option ::=

veya PRIMARY KEY dizini için UNIQUE dizin seçeneklerini belirtir. Dizin seçenekleri hakkında daha fazla bilgi için bkz: DİZİNİ OLUŞTUR (Transact-SQL).

PAD_INDEX = { ON | KAPALI }

Dizin doldurmayı belirtir. Varsayılan değer: OFF.

FILLFACTOR = FILLFACTOR

Veritabanı Altyapısı'nın dizin oluşturma veya değiştirme sırasında her dizin sayfasının yaprak düzeyini ne kadar dolu yapması gerektiğini gösteren bir yüzde belirtir. fillfactor , 1 ile 100 olan bir tamsayı değeri olmalıdır. Varsayılan değer 0'dır.

IGNORE_DUP_KEY = { ON | KAPALI }

Ekleme işlemi benzersiz bir dizine yinelenen anahtar değerleri eklemeyi denediğinde hata yanıtını belirtir. seçeneği IGNORE_DUP_KEY yalnızca dizin oluşturulduktan veya yeniden oluşturulduktan sonra ekleme işlemleri için geçerlidir. Varsayılan değer: OFF.

STATISTICS_NORECOMPUTE = { ON | KAPALI }

Dağıtım istatistiklerinin yeniden hesaplanıp hesaplanmayacağını belirtir. Varsayılan değer: OFF.

ALLOW_ROW_LOCKS = { ON | KAPALI }

Satır kilitlerine izin verilip verilmeyeceğini belirtir. Varsayılan değer: ON.

ALLOW_PAGE_LOCKS = { ON | KAPALI }

Sayfa kilitlerine izin verilip verilmeyeceğini belirtir. Varsayılan değer: ON.

En iyi yöntemler

Yan tümcesiyle SCHEMABINDING kullanıcı tanımlı bir işlev oluşturulmamışsa, temel alınan nesnelerde yapılan değişiklikler işlevin tanımını etkileyebilir ve çağrıldığında beklenmeyen sonuçlar üretebilir. temel nesnelerinde yapılan değişiklikler nedeniyle işlevin güncelliğini yitirmemesini sağlamak için aşağıdaki yöntemlerden birini uygulamanızı öneririz:

  • İşlevi WITH SCHEMABINDING oluştururken yan tümceyi belirtin. Bu seçenek, işlev tanımında başvurulan nesnelerin, işlev de değiştirilmedikçe değiştirilememesini sağlar.

  • İşlevin tanımında belirtilen herhangi bir nesneyi değiştirdikten sonra sp_refreshsqlmodule saklı yordamını yürütün.

Satır içi tablo değerli işlevler (satır içi TVF'ler) ve çok deyimli tablo değerli işlevler (MSTVF'ler) hakkında daha fazla bilgi ve performansla ilgili önemli noktalar için bkz: Kullanıcı tanımlı işlevler oluşturma (Veritabanı Altyapısı).

Veri türleri

Parametreler bir CLR işlevinde belirtilmişse, bunlar daha önce scalar_parameter_data_type için tanımlandığı gibi SQL Server türleri olmalıdır. SQL Server sistem veri türlerini CLR tümleştirme veri türleriyle veya .NET Framework ortak dil çalışma zamanı veri türleriyle karşılaştırma hakkında daha fazla bilgi için bkz: CLR Parametre Verilerini Eşleme.

SQL Server'ın bir sınıfta aşırı yüklendiğinde doğru yönteme başvurması için, içinde <method_specifier> belirtilen yöntemin aşağıdaki özelliklere sahip olması gerekir:

  • 'da [ , ...n ]belirtilenle aynı sayıda parametre alın.
  • Tüm parametreleri referansa göre değil, değere göre alın.
  • SQL Server işlevinde belirtilen türlerle uyumlu parametre türlerini kullanın.

CLR işlevinin dönüş veri türü bir tablo türü (RETURNS TABLE) belirtiyorsa, yöntemin <method_specifier> dönüş veri türü veya IEnumeratortüründe IEnumerable olmalıdır ve arabirimin işlevin oluşturucusu tarafından uygulandığını varsayar. Transact-SQL işlevlerinden farklı olarak, CLR işlevleri içinde , PRIMARY KEYveya UNIQUE veya kısıtlamaları CHECKiçeremez<table_type_definition>. 'da <table_type_definition> belirtilen sütunların veri türleri, yürütme zamanında yöntem <method_specifier> tarafından döndürülen sonuç kümesinin karşılık gelen sütunlarının türleriyle eşleşmelidir. Bu tür denetimi, işlev oluşturulduğunda gerçekleştirilmez.

CLR işlevlerinin nasıl programlanacağı hakkında daha fazla bilgi için bkz: CLR User-Defined İşlevleri.

Remarks

Skaler fonksiyonlar, hesaplanan sütunları ve CHECK kısıtlama tanımlarını içeren skaler ifadelerin kullanıldığı yerlerde çağrılabilir. Skaler fonksiyonlar EXECUTE (Transact-SQL) deyimi kullanılarak da yürütülebilir. Skaler işlevler, işlevin en az iki parçalı adı (<schema>.<function>) kullanılarak çağrılmalıdır. Çok parçalı adlar hakkında daha fazla bilgi için bkz: Transact-SQL Sözdizimi Kuralları (Transact-SQL). , FROM, , SELECTveya INSERT deyimlerinin yan tümcesinde UPDATEtablo ifadelerine DELETE izin verilen durumlarda tablo değerli işlevler çağrılabilir. Daha fazla bilgi için bkz: Kullanıcı tanımlı işlevleri yürütme.

Microsoft Fabric Data Warehouse'daki UDF'ler

Skaler UDF'ler, Doku Veri Ambarı'ndaki bir önizleme özelliğidir.

Microsoft Fabric Data Warehouse'da, skaler UDF'ler kullanıcı tablolarındaki sorgularla kullanılmak SELECT ... FROM için inlineable olmalıdır, ancak yine de inlineable olmayan fonksiyonlar oluşturabilirsiniz. Satır içi olarak kullanılamayan Skaler UDF'ler sınırlı sayıda senaryoda çalışır. UDF'nin çizili olup olmadığını kontrol edebilirsiniz. Daha fazla bilgi için, Fabric Data Warehouse için CREATE FUNCTION sürümüne bakınız.

Interoperability

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

  • Atama deyimleri.
  • Deyimler dışındaki TRY...CATCH Akış Denetimi deyimleri.
  • DECLARE Yerel veri değişkenlerini ve yerel imleçleri tanımlayan deyimler.
  • SELECT yerel değişkenlere değer atayan ifadeler içeren seçme listeleri içeren deyimler.
  • İşlevde bildirilen, açılan, kapatılan ve serbest bırakılan yerel imleçlere başvuran imleç işlemleri. Yalnızca FETCH yan tümceyi kullanarak yerel değişkenlere değer atayan INTO deyimlere izin verilir; FETCH istemciye veri döndüren deyimlere izin verilmez.
  • INSERT, UPDATEve yerel DELETE tablo değişkenlerini değiştiren deyimler.
  • EXECUTE Genişletilmiş saklı yordamları çağıran deyimler.

Daha fazla bilgi için bkz: Kullanıcı tanımlı işlevler oluşturma (Veritabanı Altyapısı).

Hesaplanan sütun birlikte çalışabilirliği

Fonksiyonlar aşağıdaki özelliklere sahiptir. Bu özelliklerin değerleri, işlevlerin kalıcı hale getirilebilen veya dizine alınabilen hesaplanan sütunlarda kullanılıp kullanılamayacağını belirler.

Property Description Notes
IsDeterministic Fonksiyon deterministik veya deterministik değildir. Deterministik fonksiyonlarda yerel veri erişimine izin verilir. Örneğin, belirli bir giriş değerleri kümesi kullanılarak çağrıldıklarında ve veritabanının aynı durumuna sahip olduklarında her zaman aynı sonucu döndüren işlevler deterministik olarak etiketlenir.
IsPrecise İşlev kesin veya kesin değil. Kesin olmayan işlevler, kayan nokta işlemleri gibi işlemleri içerir.
IsSystemVerified İşlevin duyarlık ve belirleyicilik özellikleri SQL Server tarafından doğrulanabilir.
SystemDataAccess İşlev, SQL Server'ın yerel örneğindeki sistem verilerine (sistem katalogları veya sanal sistem tabloları) erişir.
UserDataAccess İşlev, SQL Server'ın yerel örneğindeki kullanıcı verilerine erişir. Kullanıcı tanımlı tabloları ve geçici tabloları içerir, ancak tablo değişkenlerini içermez.

Transact-SQL işlevlerinin duyarlık ve belirleyicilik özellikleri SQL Server tarafından otomatik olarak belirlenir. CLR işlevlerinin veri erişimi ve belirleyicilik özellikleri kullanıcı tarafından belirtilebilir. Daha fazla bilgi için bkz: CLR tümleştirmesi: CLR yordamları için özel öznitelikler.

Bu özelliklerin geçerli değerlerini görüntülemek için OBJECTPROPERTYEX (Transact-SQL) kullanın.

Important

Fonksiyonların deterministik olabilmesi için oluşturulmalıdır SCHEMABINDING .

Kullanıcı tanımlı bir işlevi çağıran hesaplanan bir sütun, kullanıcı tanımlı işlev aşağıdaki özellik değerlerine sahip olduğunda bir dizinde kullanılabilir:

  • IsDeterministic eşittir true
  • IsSystemVerified is true (hesaplanan sütun kalıcı olmadığı sürece)
  • UserDataAccess eşittir false
  • SystemDataAccess eşittir false

Daha fazla bilgi için bkz. Hesaplanan sütunlardaki dizinler.

İşlevlerden genişletilmiş saklı yordamları çağırma

Genişletilmiş saklı yordam, bir işlevin içinden çağrıldığında, sonuç kümelerini istemciye döndüremez. İstemciye sonuç kümeleri döndüren tüm ODS API'leri .FAIL Genişletilmiş saklı yordam bir SQL Server örneğine geri bağlanabilir; Ancak, genişletilmiş saklı yordamı çağıran işlevle aynı işleme katılmaya çalışmamalıdır.

Bir toplu iş veya saklı yordamdan yapılan çağrılara benzer şekilde, genişletilmiş saklı yordam da SQL Server'ın altında çalıştığı Windows güvenlik hesabı bağlamında yürütülür. Saklı yordamın sahibi, kullanıcılara izin verirken EXECUTE bu senaryoyu göz önünde bulundurmalıdır.

Limitations

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

Kullanıcı tanımlı işlevler, hedef olarak tablo içeren bir OUTPUT INTO yan tümcesi içeremez.

Aşağıdaki Hizmet Aracısı deyimleri, Transact-SQL kullanıcı tanımlı bir işlevin tanımına dahil edilemez:

  • BEGIN DIALOG CONVERSATION
  • END CONVERSATION
  • GET CONVERSATION GROUP
  • MOVE CONVERSATION
  • RECEIVE
  • SEND

Kullanıcı tanımlı işlevler iç içe olabilir; başka bir ifadeyle, kullanıcı tanımlı bir işlev başka bir işlev çağırabilir. Çağrılan işlev yürütmeyi başlattığında iç içe geçme düzeyi artırılır ve çağrılan işlev yürütmeyi bitirdiğinde iç içe geçme düzeyi azaltılır. Kullanıcı tanımlı işlevler en fazla 32 düzey iç içe yerleştirilebilir. İç içe yerleştirme düzeylerinin üst sınırının aşılması, çağıran işlev zincirinin tamamının başarısız olmasına neden olur. Transact-SQL kullanıcı tanımlı işlevden yönetilen koda yapılan tüm başvurular, 32 düzeyli iç içe geçme sınırına karşı bir düzey olarak sayılır. Yönetilen kodun içinden çağrılan yöntemler bu sınıra karşı sayılmaz.

CLR tablo değerli işlevlerde sıralama düzeni kullanma

CLR tablo değerli işlevlerde yan tümcesini ORDER kullanırken şu yönergeleri izleyin:

  • Sonuçların her zaman belirtilen sırada sıralandığından emin olmalısınız. Sonuçlar belirtilen sırada değilse, sorgu yürütüldüğünde SQL Server bir hata iletisi oluşturur.

  • Bir ORDER yan tümce belirtilirse, tablo değerli işlevin çıktısı, sütunun harmanlamasına (açık veya örtük) göre sıralanmalıdır. Örneğin, sütun harmanlaması Çince ise, döndürülen sonuçların Çince sıralama kurallarına göre sıralanması gerekir. (Harmanlama, tablo değerli işlev için DDL'de belirtilir veya veritabanı harmanlamasından elde edilir.)

  • SQL Server, belirtilirse yan tümceyi her zaman doğrular ve sonuçları döndürürken, sorgu işlemcisinin ORDER daha fazla iyileştirme gerçekleştirmek için kullanıp kullanmadığını kontrol eder. Bu yan tümceyi ORDER yalnızca sorgu işlemcisi için yararlı olduğunu biliyorsanız kullanın.

  • SQL Server sorgu işlemcisi aşağıdaki durumlarda yan tümceden ORDER otomatik olarak yararlanır:

    • Yan tümcesinin ORDER bir dizinle uyumlu olduğu sorgular ekleyin.
    • ORDER BY Yan tümce ile ORDER uyumlu yan tümceler.
    • Agregalar, burada GROUP BY yan tümcesi ile ORDER uyumludur.
    • DISTINCT Farklı sütunların yan tümceyle ORDER uyumlu olduğu toplamalar.

Yan ORDER tümcesi, sorguda da belirtilmediği süreceSELECT, bir ORDER BY sorgu yürütüldüğünde sıralı sonuçları garanti etmez. Tablo değerli işlevler için sıralama düzenine dahil edilen sütunların nasıl sorgulanacağı hakkında bilgi için sys.function_order_columns (Transact-SQL) bölümüne bakın.

Metadata

Aşağıdaki tabloda, kullanıcı tanımlı işlevlerle ilgili meta verileri döndürmek için kullanabileceğiniz sistem kataloğu görünümleri listelenmektedir.

Sistem görünümü Description
sys.sql_modules Örnekler bölümündeki örnek E'ye bakın.
sys.assembly_modules CLR kullanıcı tanımlı işlevler hakkında bilgi görüntüler.
sys.parameters Kullanıcı tanımlı işlevlerde tanımlanan parametreler hakkında bilgi görüntüler.
sys.sql_expression_dependencies Bir işlev tarafından başvurulan temel nesneleri görüntüler.

Permissions

Veritabanında CREATE FUNCTION izni ve işlevin oluşturulduğu şema üzerinde ALTER izni gerektirir. İşlev kullanıcı tanımlı bir tür belirtiyorsa, tür üzerinde EXECUTE izni gerektirir.

Examples

UDF'ler hakkında daha fazla örnek ve performansla ilgili önemli noktalar için bkz: Kullanıcı tanımlı işlevler oluşturma (Veritabanı Altyapısı).

A. ISO haftasını hesaplayan skaler değerli kullanıcı tanımlı bir işlev kullanın

Aşağıdaki örnek, kullanıcı tanımlı işlevi ISOweekoluşturur. Bu işlev bir tarih bağımsız değişkeni alır ve ISO hafta numarasını hesaplar. Bu işlevin doğru bir şekilde hesaplanması için, SET DATEFIRST 1 işlev çağrılmadan önce çağrılmalıdır.

Örnek ayrıca, bir saklı yordamın yürütülebileceği güvenlik bağlamını belirtmek için EXECUTE AS Yan Tümcesi (Transact-SQL) yan tümcesinin kullanılmasını da gösterir. Örnekte seçenek CALLER , yordamın kendisini çağıran kullanıcının bağlamında yürütüldüğünü belirtir. Belirtebileceğiniz diğer seçenekler , SELFve OWNER.

İşlev çağrısı aşağıda verilmiştir. DATEFIRST olarak ayarlanır 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';

Sonuç kümesi aşağıdadır.

ISO Week
----------------
52

B. Satır içi tablo değerli işlev oluşturma

Aşağıdaki örnek, AdventureWorks2025 veritabanında satır içi tablo değerli bir fonksiyon döndürür. Üç sütun ProductIDdöndürür ve mağazaya Namesatılan her ürün için mağazaya YTD Total göre yıl başından bugüne kadar olan toplamların toplamını döndürür.

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

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

SELECT * FROM Sales.ufn_SalesByStore (602);

C. Çok deyimli tablo değerli bir işlev oluşturma

Aşağıdaki örnek, veritabanında ufn_FindReports(InEmpID) tablo değerli işlevi AdventureWorks2025 oluşturur. Geçerli bir çalışan kimliği ile sağlandığında, işlev, çalışana doğrudan veya dolaylı olarak rapor veren tüm çalışanlara karşılık gelen bir tablo döndürür. İşlev, çalışanların hiyerarşik listesini oluşturmak için özyinelemeli bir ortak tablo ifadesi (CTE) kullanır. Özyinelemeli CTE'ler hakkında daha fazla bilgi için bkz: common_table_expression İLE (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. CLR işlevi oluşturma

Örnek, CLR işlevini len_soluşturur. İşlev oluşturulmadan önce, derleme SurrogateStringFunction.dll yerel veritabanına kaydedilir.

Şunlar için geçerlidir: SQL Server 2008 (10.0.x) SP 1 ve sonraki sürümleri.

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

CLR tablo değerli bir işlev oluşturma örneği için bkz: CLR Table-Valued İşlevleri.

E. Kullanıcı tanımlı işlevlerin tanımını görüntüleyin

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

Seçenek kullanılarak oluşturulan işlevlerin ENCRYPTION tanımı kullanılarak sys.sql_modulesgörüntülenemez; ancak, şifrelenmiş işlevlerle ilgili diğer bilgiler görüntülenir.