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
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ı gerekirNot
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.
- logical_expression
<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 |
---|---|
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. |
|
clr kullanıcı tanımlı işlevler hakkında bilgi görüntüler. |
|
Kullanıcı tanımlı işlevler tanımlanan parametreleri hakkında bilgi görüntüler. |
|
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.
Ayrıca bkz.
Başvuru
Diğer Kaynaklar
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. |