Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Şunlar için geçerlidir:Microsoft Fabric'te SQL analiz uç noktası ve Ambarı
CREATE FUNCTION satır içi tablo-değer işlevleri ve skaler işlevler oluşturabilir.
Uyarı
Skaler UDF'ler, Doku Veri Ambarı'ndaki bir önizleme özelliğidir.
Önemli
Doku Veri Ambarı'nda skaler UDF'lerin kullanıcı tablolarındaki sorgularla SELECT ... FROM kullanılmak üzere satır içi olması gerekir, ancak yine de satır içi olmayan işlevler 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.
Kullanıcı tanımlı işlev, parametreleri kabul eden, karmaşık hesaplama gibi bir eylem gerçekleştiren ve bu eylemin sonucunu değer olarak döndüren Transact-SQL bir yordamdır. Skaler işlevler sayı veya dize gibi bir skaler değer döndürür. Kullanıcı tanımlı tablo değerli işlevler (TVF'ler) bir tablo döndürür.
Şu yollarla kullanılabilecek yeniden kullanılabilir bir T-SQL yordamı oluşturmak için kullanın CREATE FUNCTION :
- Gibi Transact-SQL ifadelerde
SELECT - Transact-SQL , ve gibi
UPDATEINSERTveri işleme deyimlerinde (DML)DELETE - İşlevi çağıran uygulamalarda
- Başka bir kullanıcı tanımlı fonksiyonun tanımında
- Saklı yordamı değiştirmek için
Tavsiye
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ı
Sözdizimi
Skaler işlev söz dizimi
CREATE FUNCTION [ schema_name. ] function_name
( [ { @parameter_name [ AS ] parameter_data_type
[ = default ] }
[ ,...n ]
]
)
RETURNS return_data_type
[ WITH <function_option> [ ,...n ] ]
[ AS ]
BEGIN
function_body
RETURN scalar_expression
END
[ ; ]
<function_option>::=
{
[ SCHEMABINDING ]
| [ RETURNS NULL ON NULL INPUT | CALLED ON NULL INPUT ]
}
Satır içi tablo değerli işlev söz dizimi
CREATE FUNCTION [ schema_name. ] function_name
( [ { @parameter_name [ AS ] parameter_data_type
[ = default ] }
[ ,...n ]
]
)
RETURNS TABLE
[ WITH SCHEMABINDING ]
[ AS ]
RETURN [ ( ] select_stmt [ ) ]
[ ; ]
Tartışmalar
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ın kurallarına uymalıdır ve veritabanında ve şemasında benzersiz olmalıdır.
Uyarı
Parametre belirtilmemiş olsa bile işlev adından sonra parantez gerekir.
@ 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 at 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.
Uyarı
ANSI_WARNINGS saklı yordamda, kullanıcı tanımlı işlevde parametre geçirirken veya bir batch deyiminde değişkenleri bildirdiğinizde ve ayarladığınızda kabul edilmez. Örneğin, bir değişken char(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.
parameter_data_type
Parametre veri türü. Transact-SQL işlevleri için desteklenen tüm skaler veri türlerine izin verilir.
[ = 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.
İş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.
return_data_type
Skaler kullanıcı tanımlı bir işlevin dönüş değeri.
Doku Veri Ambarı'ndaki işlevler için rowversion/zaman damgası dışında tüm veri türlerine izin verilir. Tablo gibi nonscalar türlere izin verilmez.
function_body
Bir dizi Transact-SQL deyimi.
skaler işlevlerde function_body , birlikte skaler bir değer olarak değerlendirilen ve şunları içerebilen bir dizi Transact-SQL deyimidir:
- Tek deyimli ifade
- Çok deyimli ifadeler (
IF/THEN/ELSEveBEGIN/ENDbloklar) - Yerel değişkenler
- Kullanılabilir yerleşik SQL işlevlerine yapılan çağrılar
- Diğer UDF'lere yapılan çağrılar
-
SELECTdeyimleri ve tablolara, görünümlere ve satır içi tablo değerli işlevlere başvurular
scalar_expression
Skaler fonksiyonun döndürdüğü skaler değeri belirtir.
select_stmt
Satır içi tablo değerli bir işlevin dönüş değerini tanımlayan tek SELECT deyim. Satır içi tablo değerli bir işlev için işlev gövdesi yoktur; tablo, tek SELECT bir deyimin sonuç kümesidir.
TABLO
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 (önizleme), TABLE dönüş değeri tek SELECT bir deyimle tanımlanır. Satır içi işlevlerin ilişkili dönüş değişkenleri yoktur.
<function_option>
Doku Veri Ambarı'nda INLINE, ENCRYPTIONve EXECUTE AS anahtar sözcükleri desteklenmez.
Desteklenen işlev seçenekleri şunlardır:
SCHEMABINDING
İşlevin, başvurduğu veritabanı nesnelerine bağlı olduğunu belirtir. SCHEMABINDING belirtildiğinde, 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, SCHEMABINDING seçeneği belirtilmediğinde ALTER deyimi kullanılarak değiştirilir.
Bir işlev, yalnızca aşağıdaki koşullar doğruysa şemaya bağlı olabilir:
İşlev tarafından başvuruda bulunan kullanıcı tanımlı işlevler de şemaya bağlıdır.
İşlev tarafından başvurulan nesnelere iki bölümlü bir ad kullanılarak başvurulur.
UDF'lerin gövdesinde yalnızca aynı veritabanındaki yerleşik işlevlere ve diğer UDF'lere başvurulabilir.
deyimini yürüten kullanıcının, işlevin
CREATE FUNCTIONbaşvurduğunu veritabanı nesneleri üzerinde REFERENCES izni vardır.
SCHEMABINDING'i kaldırmak için kullanın ALTER.
NULL GIRIŞTE NULL DÖNDÜRÜR | NULL GIRIŞTE ÇAĞRıLıR
Skaler OnNULLCall değerli bir işlevin özniteliğini belirtir. Belirtilmezse, CALLED ON NULL INPUT varsayılan olarak örtülür ve işlev gövdesi bağımsız değişken olarak geçirilse NULL bile yürütülür.
En iyi yöntemler
Kullanıcı tanımlı bir işlev şema bağlama ile oluşturulmazsa, temel nesnelerde yapılan değişiklikler işlevin tanımını etkileyebilir ve çağrıldığında beklenmeyen sonuçlar üretebilir. İşlevi oluştururken yan tümcesini
WITH SCHEMABINDINGbelirtmeniz önerilir. Bu, işlev tanımında başvurulan nesnelerin, işlev de değiştirilmediği sürece değiştirilememesini sağlar.Kullanıcı tanımlı işlevlerinizi satır içi olarak yazma. Daha fazla bilgi için bkz . Scalar UDF inlining.
Birlikte çalışabilirlik
Satır içi tablo değerli kullanıcı tanımlı işlevler
Satır içi tablo değerli bir işlevde yalnızca tek bir select deyimine izin verilir.
Skaler kullanıcı tanımlı işlevler
Aşağıdaki deyimler skaler değerli bir işlevde geçerlidir:
- Atama ifadeleri
- Deyimler dışında
TRY...CATCHAkış Denetimi deyimleri -
DECLAREyerel veri değişkenlerini tanımlayan deyimler
Aşağıdaki yerleşik işlevler skaler değerli bir işlev gövdesinde desteklenmez:
Skaler UDF'ler aşağıdaki durumlarda kullanıcı tablosundaki bir sorguda
SELECT ... FROMkullanılamaz:- UDF gövdesi, belirleyici olmayan yerleşik işlev çağrısı içerir. Bkz . Deterministic ve nondeterministic functions.
- UDF gövdesi ortak bir tablo ifadesi (CTE) içerir.
- UDF gövdesi altı
IF-THEN-ELSEblok ötesinde çok deyimli UDF gövdesi içerir. - UDF gövdesi bir WHILE LOOP içeriyor
- UDF gövdesi diğer nedenlerle çizilemez. Daha fazla bilgi için bkz . Skaler UDF inlining gereksinimleri.
Aşağıdaki durumlarda Skaler UDF'ler sorguda kullanılamaz:
- UDF doğrudan bir
GROUP BYyan tümcesinde çağrılır. - UDF doğrudan bir
ORDER BYyan tümcesinde çağrılır. - çağıran sorgu ortak bir tablo ifadesi (CTE) içeriyor.
- UDF doğrudan bir
Özyinelemeli skaler UDF'ler desteklenmez.
Tek bir sorguda 10'dan fazla UDF çağrısı yapıldığında Kullanıcı sorgusu başarısız olabilir.
Bazı uç durumlarda, kullanıcı sorgusunun ve UDF gövdesinin karmaşıklığı, skaler UDF'nin çizili olmamasını ve kullanıcı sorgusunun başarısız olmasını önlemektedir.
Desteklenmeyen herhangi bir senaryoda skaler UDF kullanıldığında "
Scalar UDF execution is currently unavailable in this context." hata iletisi görürsünüz
Sınırlamalar
Uyarı
Geçerli önizleme sırasında sınırlamalar değiştirilebilir.
Kullanıcı tanımlı işlevler, veritabanı durumunu değiştiren eylemleri gerçekleştirmek için kullanılamaz.
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. Doku Veri Ambarı'ndaki kullanıcı tanımlı işlevler, UDF gövdesi bir tablo/görünüm/satır içi tablo değerli işleve başvurduğunda en fazla dört düzey veya aksi takdirde en fazla 32 düzey iç içe geçirilebilir. İç içe yerleştirme düzeylerinin üst sınırının aşılması, çağıran işlev zincirinin başarısız olmasına neden olur.
Meta veriler
Bu bölümde, kullanıcı tanımlı işlevlerle ilgili meta verileri döndürmek için kullanabileceğiniz sistem kataloğu görünümleri listelenir.
sys.sql_modules: Transact-SQL kullanıcı tanımlı işlevlerin tanımını görüntüler. Örneğin:
SELECT definition, type FROM sys.sql_modules AS m JOIN sys.objects AS o ON m.object_id = o.object_id AND type = ('FN');sys.parameters: Kullanıcı tanımlı işlevlerde tanımlanan parametrelerle ilgili bilgileri görüntüler.
sys.sql_expression_dependencies: bir işlev tarafından başvuruda bulunan temel nesneleri görüntüler.
İzinler
Doku çalışma alanı Yönetici, Üye ve Katkıda Bulunan rollerinin üyeleri işlevler oluşturabilir.
Skaler UDF satır içi yerleştirme
Microsoft Fabric Veri Ambarı, kullanıcı tanımlı kodu dağıtılmış bir şekilde derlemek ve yürütmek için skaler UDF inlining kullanır. Skaler UDF inlining varsayılan olarak etkindir.
Skaler UDF inlining, ilk olarak Microsoft SQL Server 2019'da (15.0) kullanıma sunulan bir performans iyileştirme tekniği olsa da, Doku Veri Ambarı'nda desteklenen senaryo kümesini belirler. Doku Veri Ambarı'nda skaler UDF'ler otomatik olarak UDF işleci yerine çağrı sorgusunda değiştirilen skaler ifadelere veya skaler alt sorgulara dönüştürülür.
Bazı T-SQL söz dizimleri skaler UDF'nin satırlanamaz olmasını sağlar. Döngü, birden çok WHILE deyim veya belirsiz bir SQL yerleşik işlevine (veya RETURNgibiGETUTCDATE()) yönelik bir çağrı içeren GETDATE() işlevler çizili olamaz. Daha fazla bilgi için bkz . Skaler UDF inlining gereksinimleri.
Skaler UDF'nin çizili olup olmadığını denetleyin
Katalog sys.sql_modules görünümü, UDF'nin satır içi olup olmadığını gösteren sütununu is_inlineableiçerir.
is_inlineable özelliği, UDF tanımının içinde söz dizimi denetiminden türetilir. Skaler UDF, derleme zamanından önce çizili değildir. değeri 1 UDF'nin satır içi olduğunu, değeri 0 ise satır içi olmadığını gösterir. Skaler UDF satır içiyse, sorgu derlendiğinde her zaman satır içine alınacağını garanti etmez.
Doku Veri Ambarı, genel sorgu karmaşıklığına bağlı olarak bir UDF'yi satır içi olarak satır içi yapmak isteyip istemediğinize (sorgu başına) karar verir.
Skaler UDF'nin satır içi olup olmadığını denetlemek için aşağıdaki örnek sorguyu kullanın:
SELECT
SCHEMA_NAME(b.schema_id) as function_schema_name,
b.name as function_name,
b.type_desc as function_type,
a.is_inlineable
FROM sys.sql_modules AS a
INNER JOIN sys.objects AS b
ON a.object_id = b.object_id
WHERE b.type IN ('FN');
bir skaler işlev içinde sys.sql_modules.is_inlineablesatır içi olarak kullanılamıyorsa, bir değişken ayarlamak için sorguyu tek başına çağrı olarak yürütmeye devam edebilirsiniz. Ancak skaler işlev, kullanıcı tablosundaki bir SELECT ... FROM sorgunun parçası olamaz. Örneğin:
CREATE FUNCTION [dbo].[custom_SYSUTCDATETIME]()
RETURNS datetime2(6)
AS
BEGIN
RETURN SYSUTCDATETIME();
END
Örnek dbo.custom_SYSUTCDATETIME skaler kullanıcı tanımlı işlev, belirsiz bir sistem işlevinin SYSUTCDATETIME()kullanılması nedeniyle satır içi olarak belirlenemez. Kullanıcı tablosundaki bir SELECT ... FROM sorguda kullanıldığında başarısız olur, ancak tek başına çağrı olarak başarılı olur, örneğin:
DECLARE @utcdate datetime2(7);
SET @utcdate = dbo.custom_SYSUTCDATETIME();
SELECT @utcdate as 'utc_date';
Örnekler
A. Satır içi tablo değerli işlev oluşturma
Aşağıdaki örnek, parametreye göre objectType filtreleyerek modüllerle ilgili bazı önemli bilgileri döndürmek için satır içi tablo değerli bir işlev oluşturur. İşlev parametresiyle DEFAULT çağrıldığında tüm modülleri döndürmek için varsayılan bir değer içerir. Bu örnek , Meta Verilerde belirtilen sistem kataloğu görünümlerinden bazılarını kullanır.
CREATE FUNCTION dbo.ModulesByType (@objectType CHAR(2) = '%%')
RETURNS TABLE
AS
RETURN (
SELECT sm.object_id AS 'Object Id',
o.create_date AS 'Date Created',
OBJECT_NAME(sm.object_id) AS 'Name',
o.type AS 'Type',
o.type_desc AS 'Type Description',
sm.DEFINITION AS 'Module Description',
sm.is_inlineable AS 'Inlineable'
FROM sys.sql_modules AS sm
INNER JOIN sys.objects AS o ON sm.object_id = o.object_id
WHERE o.type LIKE '%' + @objectType + '%'
);
GO
İşlev daha sonra aşağıdakilerle birlikte tüm satır içi tablo değerli işlevleri (IF) döndürmek için çağrılabilir:
SELECT * FROM dbo.ModulesByType('IF'); -- SQL_INLINE_TABLE_VALUED_FUNCTION
Veya tüm skaler işlevleri (FN):
SELECT * FROM dbo.ModulesByType('FN'); -- SQL_SCALAR_FUNCTION
B. Satır içi tablo değerli işlevin sonuçlarını birleştirme
Bu basit örnek, çapraz uygulama kullanılarak sonuçlarının diğer tablolarla nasıl birleştirilebileceğini göstermek için önceden oluşturulmuş satır içi TVF'yi kullanır. Burada hem sütundaki tüm sütunları hem de sys.objects sütunda eşleşen tüm satırların ModulesByTypetype sonuçlarını seçiyoruz. apply kullanma hakkında daha fazla bilgi için bkz . FROM yan tümcesi artı JOIN, APPLY, PIVOT (Transact-SQL).
SELECT *
FROM sys.objects AS o
CROSS APPLY dbo.ModulesByType(o.type);
GO
C. Skaler UDF işlevi oluşturma
Aşağıdaki örnek, bir giriş metnini maskeleyen satır içi bir skaler UDF oluşturur.
CREATE OR ALTER FUNCTION [dbo].[cleanInput] (@InputString VARCHAR(100))
RETURNS VARCHAR(50)
AS
BEGIN
DECLARE @Result VARCHAR(50)
DECLARE @CleanedInput VARCHAR(50)
-- Trim whitespace
SET @CleanedInput = LTRIM(RTRIM(@InputString))
-- Handle empty or null input
IF @CleanedInput = '' OR @CleanedInput IS NULL
BEGIN
SET @Result = ''
END
ELSE IF LEN(@CleanedInput) <= 2
BEGIN
-- If string length is 1 or 2, just return the cleaned string
SET @Result = @CleanedInput
END
ELSE
BEGIN
-- Construct the masked string
SET @Result =
LEFT(@CleanedInput, 1) +
REPLICATE('*', LEN(@CleanedInput) - 2) +
RIGHT(@CleanedInput, 1)
END
RETURN @Result
END
İşlevi şu şekilde çağırabilirsiniz:
DECLARE @input varchar(100) = '123456789'
SELECT dbo.cleanInput (@input) AS function_output;
Doku Veri Ambarı'nda skaler UDF'leri kullanma hakkında daha fazla örnek:
Bir SELECT deyimde:
SELECT TOP 10
t.id, t.name,
dbo.cleanInput (t.name) AS function_output
FROM dbo.MyTable AS t;
Yan tümcesinde WHERE :
SELECT t.id, t.name, dbo.cleanInput(t.name) AS function_output
FROM dbo.MyTable AS t
WHERE dbo.cleanInput(t.name)='myvalue'
Yan tümcesinde JOIN :
SELECT t1.id, t1.name,
dbo.cleanInput (t1.name) AS function_output,
dbo.cleanInput (t2.name) AS function_output_2
FROM dbo.MyTable1 AS t1
INNER JOIN dbo.MyTable2 AS t2
ON dbo.cleanInput(t1.name)=dbo.cleanInput(t2.name);
Yan ORDER BY tümcesinde:
SELECT t.id, t.name, dbo.cleanInput (t.name) AS function_output
FROM dbo.MyTable AS t
ORDER BY function_output;
, veya INSERTgibi UPDATEDELETEveri işleme dili (DML) deyimlerinde:
SELECT t.id, t.name, dbo.cleanInput (t.name) AS function_output
INTO dbo.MyTable_new
FROM dbo.MyTable AS t;
UPDATE t
SET t.mycolumn_new = dbo.cleanInput (t.name)
FROM dbo.MyTable AS t;
DELETE t
FROM dbo.MyTable AS t
WHERE dbo.cleanInput (t.name) ='myvalue';
İlgili içerik
Azure Synapse Analytics veya Analytics Platform Sistemi'nde (PDW) kullanıcı tanımlı bir işlev (UDF) oluşturur. Kullanıcı tanımlı işlev, parametreleri kabul eden, karmaşık hesaplama gibi bir eylem gerçekleştiren ve bu eylemin sonucunu değer olarak döndüren Transact-SQL bir yordamdır. Kullanıcı tanımlı tablo değerli işlevler (TVF'ler) bir tablo veri türü döndürür.
Tavsiye
Fabric Data Warehouse'daki sözdizimi için, Fabric Data Warehouse için CREATE FUNCTION sürümüne bakınız.
Analiz Platformu Sistemi'nde (PDW), dönüş değeri skaler (tek) bir değer olmalıdır.
Azure Synapse Analytics'te,
CREATE FUNCTIONsatır içi tablo değerli işlevlerin (önizleme) söz dizimini kullanarak bir tablo döndürebilir veya skaler işlevlerin söz dizimini kullanarak tek bir değer döndürebilir.Azure Synapse Analytics'teki sunucusuz SQL havuzlarında
CREATE FUNCTIONsatır içi tablo-değer işlevleri oluşturabilir ancak skaler işlevler oluşturameyebilir.Bu şekillerde kullanılabilecek yeniden kullanılabilir bir rutin oluşturmak için bu deyimi kullanın:
Gibi Transact-SQL ifadelerde
SELECTİşlevi çağıran uygulamalarda
Başka bir kullanıcı tanımlı fonksiyonun tanımında
Bir sütunda CHECK kısıtlaması 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
Transact-SQL söz dizimi kuralları
Sözdizimi
Skaler işlev söz dizimi
-- Transact-SQL Scalar Function Syntax (in dedicated pools in Azure Synapse Analytics and Parallel Data Warehouse)
-- Not available in the serverless SQL pools in Azure Synapse Analytics
CREATE FUNCTION [ schema_name. ] function_name
( [ { @parameter_name [ AS ] parameter_data_type
[ = default ] }
[ ,...n ]
]
)
RETURNS return_data_type
[ WITH <function_option> [ ,...n ] ]
[ AS ]
BEGIN
function_body
RETURN scalar_expression
END
[ ; ]
<function_option>::=
{
[ SCHEMABINDING ]
| [ RETURNS NULL ON NULL INPUT | CALLED ON NULL INPUT ]
}
Satır içi tablo değerli işlev söz dizimi
-- Transact-SQL Inline Table-Valued Function Syntax
-- Preview in dedicated SQL pools in Azure Synapse Analytics
-- Available in the serverless SQL pools in Azure Synapse Analytics
CREATE FUNCTION [ schema_name. ] function_name
( [ { @parameter_name [ AS ] parameter_data_type
[ = default ] }
[ ,...n ]
]
)
RETURNS TABLE
[ WITH SCHEMABINDING ]
[ AS ]
RETURN [ ( ] select_stmt [ ) ]
[ ; ]
Tartışmalar
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ın kurallarına uymalıdır ve veritabanında ve şemasında benzersiz olmalıdır.
Uyarı
Parametre belirtilmemiş olsa bile işlev adından sonra parantez gerekir.
@ 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 at 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.
Uyarı
ANSI_WARNINGS saklı yordamda, kullanıcı tanımlı işlevde parametre geçirirken veya bir batch deyiminde değişkenleri bildirdiğinizde ve ayarladığınızda kabul edilmez. Örneğin, bir değişken char(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.
parameter_data_type
Parametre veri türü. Transact-SQL işlevleri için Azure Synapse Analytics'te desteklenen tüm skaler veri türlerine izin verilir. Zaman damgası (rowversion) veri türü desteklenen bir tür değildir.
[ = 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.
İşlevin bir parametresi varsayılan değere sahip olduğunda, varsayılan değeri almak için işlev çağrıldığında DEFAULT anahtar sözcüğü belirtilmelidir. 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.
return_data_type
Skaler kullanıcı tanımlı bir işlevin dönüş değeri. Transact-SQL işlevleri için Azure Synapse Analytics'te desteklenen tüm skaler veri türlerine izin verilir. Rowversion/zaman damgası veri türü desteklenen bir tür değil. İmleç ve tablo nonscalar türlerine izin verilmez.
function_body
Transact-SQL deyimleri dizisi.
function_body bir SELECT deyim içeremez ve veritabanı verilerine başvuramaz.
function_body tablolara veya görünümlere başvuramaz. İşlev gövdesi diğer belirleyici işlevleri çağırabilir ancak belirsiz işlevleri çağıramaz.
Skaler fonksiyonlarda function_body, birlikte skaler bir değer olarak değerlendirilen bir dizi Transact-SQL deyimidir.
scalar_expression
Skaler fonksiyonun döndürdüğü skaler değeri belirtir.
select_stmt
Satır içi tablo değerli bir işlevin dönüş değerini tanımlayan tek SELECT deyim. Satır içi tablo değerli bir işlev için işlev gövdesi yoktur; tablo, tek SELECT bir deyimin sonuç kümesidir.
TABLO
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 (önizleme), TABLE dönüş değeri tek SELECT bir deyimle tanımlanır. Satır içi işlevlerin ilişkili dönüş değişkenleri yoktur.
<function_option>
İşlevin aşağıdaki seçeneklerden bir veya daha fazlasına sahip olduğunu belirtir.
SCHEMABINDING
İşlevin, başvurduğu veritabanı nesnelerine bağlı olduğunu belirtir. SCHEMABINDING belirtildiğinde, 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, SCHEMABINDING seçeneği belirtilmediğinde ALTER deyimi kullanılarak değiştirilir.
Bir işlev, yalnızca aşağıdaki koşullar doğruysa şemaya bağlı olabilir:
İşlev tarafından başvuruda bulunan kullanıcı tanımlı işlevler de şemaya bağlıdır.
İşlev tarafından başvuruda bulunan işlevlere ve diğer UDF'lere tek parçalı veya iki parçalı bir ad kullanılarak başvurulur.
UDF'lerin gövdesinde yalnızca aynı veritabanındaki yerleşik işlevlere ve diğer UDF'lere başvurulabilir.
deyimini yürüten kullanıcının, işlevin
CREATE FUNCTIONbaşvurduğunu veritabanı nesneleri üzerinde REFERENCES izni vardır.
SCHEMABINDING'i kaldırmak için kullanın ALTER.
NULL GIRIŞTE NULL DÖNDÜRÜR | NULL GIRIŞTE ÇAĞRıLıR
Skaler OnNULLCall değerli bir işlevin özniteliğini belirtir. Belirtilmezse, CALLED ON NULL INPUT varsayılan olarak örtülür ve işlev gövdesi bağımsız değişken olarak geçirilse NULL bile yürütülür.
En iyi yöntemler
SchemaBINDING yan tümcesiyle kullanıcı tanımlı bir işlev oluşturulmazsa, temel nesnelerde yapılan değişiklikler işlevin tanımını etkileyebilir ve çağrıldığında beklenmeyen sonuçlar verebilir. İşlevi oluştururken yan tümcesini WITH SCHEMABINDING belirtmeniz önerilir. Bu, işlev tanımında başvurulan nesnelerin, işlev de değiştirilmediği sürece değiştirilememesini sağlar.
Birlikte çalışabilirlik
Aşağıdaki deyimler skaler değerli bir işlevde geçerlidir:
Atama deyimleri.
TRY dışındaki Akış Denetimi deyimleri... CATCH deyimleri.
Yerel veri değişkenlerini tanımlayan DECLARE deyimleri.
Satır içi tablo değerli bir işlevde (önizleme), yalnızca tek bir select deyimine izin verilir.
Sınırlamalar
Kullanıcı tanımlı işlevler, veritabanı durumunu değiştiren eylemleri gerçekleştirmek için kullanılamaz.
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. İç 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.
İşlevler de dahil olmak üzere nesneler, Azure Synapse Analytics'teki master sunucusuz SQL havuzunuzun veritabanında oluşturulamaz.
Meta veriler
Bu bölümde, kullanıcı tanımlı işlevlerle ilgili meta verileri döndürmek için kullanabileceğiniz sistem kataloğu görünümleri listelenir.
sys.sql_modules: Transact-SQL kullanıcı tanımlı işlevlerin tanımını görüntüler. Örneğin:
SELECT definition, type FROM sys.sql_modules AS m JOIN sys.objects AS o ON m.object_id = o.object_id AND type = ('FN');sys.parameters: Kullanıcı tanımlı işlevlerde tanımlanan parametrelerle ilgili bilgileri görüntüler.
sys.sql_expression_dependencies: bir işlev tarafından başvuruda bulunan temel nesneleri görüntüler.
İzinler
Veritabanında CREATE FUNCTION izni ve işlevin oluşturulduğu şemada ALTER izni gerektirir.
Örnekler
A. Veri türünü değiştirmek için skaler değerli kullanıcı tanımlı bir işlev kullanma
Bu basit işlev giriş olarak bir int veri türü alır ve çıkış olarak ondalık (10,2) veri türü döndürür.
CREATE FUNCTION dbo.ConvertInput (@MyValueIn int)
RETURNS decimal(10,2)
AS
BEGIN
DECLARE @MyValueOut int;
SET @MyValueOut= CAST( @MyValueIn AS decimal(10,2));
RETURN(@MyValueOut);
END;
GO
SELECT dbo.ConvertInput(15) AS 'ConvertedValue';
Uyarı
Skaler işlevler sunucusuz SQL havuzlarında kullanılamaz.
B. Satır içi tablo değerli işlev oluşturma
Aşağıdaki örnek, parametreye göre objectType filtreleyerek modüllerle ilgili bazı önemli bilgileri döndürmek için satır içi tablo değerli bir işlev oluşturur. İşlev parametresiyle DEFAULT çağrıldığında tüm modülleri döndürmek için varsayılan bir değer içerir. Bu örnek , Meta Verilerde belirtilen sistem kataloğu görünümlerinden bazılarını kullanır.
CREATE FUNCTION dbo.ModulesByType(@objectType CHAR(2) = '%%')
RETURNS TABLE
AS
RETURN
(
SELECT
sm.object_id AS 'Object Id',
o.create_date AS 'Date Created',
OBJECT_NAME(sm.object_id) AS 'Name',
o.type AS 'Type',
o.type_desc AS 'Type Description',
sm.definition AS 'Module Description'
FROM sys.sql_modules AS sm
JOIN sys.objects AS o ON sm.object_id = o.object_id
WHERE o.type like '%' + @objectType + '%'
);
GO
İşlev daha sonra aşağıdakilerle tüm görünüm (V) nesnelerini döndürmek için çağrılabilir:
select * from dbo.ModulesByType('V');
Uyarı
Satır içi tablo-değer işlevleri sunucusuz SQL havuzlarında kullanılabilir, ancak ayrılmış SQL havuzlarında önizleme aşamasındadır.
C. Satır içi tablo değerli işlevin sonuçlarını birleştirme
Bu basit örnek, çapraz uygulama kullanılarak sonuçlarının diğer tablolarla nasıl birleştirilebileceğini göstermek için önceden oluşturulmuş satır içi TVF'yi kullanır. Burada hem sütundaki tüm sütunları hem de sys.objects sütunda eşleşen tüm satırların ModulesByTypetype sonuçlarını seçiyoruz. apply kullanma hakkında daha fazla bilgi için bkz . FROM yan tümcesi artı JOIN, APPLY, PIVOT (Transact-SQL).
SELECT *
FROM sys.objects o
CROSS APPLY dbo.ModulesByType(o.type);
GO
Uyarı
Satır içi tablo-değer işlevleri sunucusuz SQL havuzlarında kullanılabilir, ancak ayrılmış SQL havuzlarında önizleme aşamasındadır.