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 Microsoft Fabric'teki Ambar
CREATE FUNCTION satır içi tablo değerli fonksiyonlar ve skaler fonksiyonlar oluşturur.
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. Sınırsız olmayan skaler UDF'ler sınırlı sayıda senaryoda işe yarar.
UDF'nin çizili olup olmadığını kontrol edebilirsiniz.
Kullanıcı tarafından tanımlanan bir fonksiyon, parametreleri kabul eden, karmaşık bir hesaplama gibi bir eylemi gerçekleştiren ve bu eylemin sonucunu değer olarak döndüren Transact-SQL bir rutindir. 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.
CREATE FUNCTION Yeniden kullanılabilir bir T-SQL rutini oluşturmak için şu şekilde kullanabilirsiniz:
- 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
CREATE OR ALTER FUNCTION Eğer bu isimle yeni bir fonksiyon yoksa yeni bir fonksiyon oluşturmayı belirtebilir veya mevcut bir fonksiyonu tek bir ifadede 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ı. Fonksiyon isimleri, tanımlayıcı kurallarına uymalı ve veritabanı ile şeması içinde benzersiz olmalıdır.
Uyarı
Parametre belirtmeseniz bile fonksiyon adından sonra parantez eklemeniz gerekir.
@ parameter_name
Kullanıcı tanımlı işlevdeki bir parametre. Bir veya daha fazla parametre ilan edebilirsiniz.
Bir fonksiyonun en fazla 2.100 parametresi olabilir. Bir kullanıcı veya uygulama bir fonksiyon çağırdığında, her ilan edilen parametrenin değeri, parametre için varsayılan bir tanımlanmadıkça sağlanmalıdır.
İlk karakter olarak at işareti (@) kullanarak bir parametre adı belirtin. Parametre adı, tanımlayıcılar için gereken kuralları takip etmelidir. Parametreler fonksiyona göre lokaldir; Aynı parametre isimlerini diğer fonksiyonlarda da kullanabilirsiniz. Parametreler yalnızca sabitlerin yerini alabilir; Tablo isimleri, sütun adları veya diğer veritabanı nesnelerinin adları yerine kullanılamazlar.
Uyarı
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şkeni char(3) olarak tanımlarsanız ve ardından üç karakterden büyük bir değere ayarsanız, veri tanımlanmış boyuta kısılır ve SQL ifadesi 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ımlarsanız, o parametre için bir değer belirtmeden fonksiyonu çalıştırabilirsiniz.
Fonksiyonun bir parametresi varsayılan değere sahipse, varsayılan değeri almak için fonksiyonu çağırırken anahtar kelimeyi DEFAULT belirtmelisiniz. 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 skaler olmayan türler yasaktır.
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 - Kontrol akış ifadeleri (
WHILEdöngüler,RETURNS)
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 fonksiyon için fonksiyon gövdesi yoktur; tablo, tek SELECT bir ifadenin sonuç kümesidir.
TABLE
Tablo değerli işlevin (TVF) döndürülen değerinin bir tablo olduğunu belirtir. TVF'lere sadece sabitleri ve @local_variables verebilirsiniz.
Inline TVF'lerde (önizleme), geri dönüş değeri tek TABLE bir ifadeyle tanımlanırSELECT. Satır içi işlevlerin ilişkili dönüş değişkenleri yoktur.
<function_option>
Fabric Data Warehouse'de, INLINE, ENCRYPTION, ve EXECUTE AS anahtar kelimeler desteklenmez.
Desteklenen fonksiyon seçenekleri şunlardır:
SCHEMABINDING
İşlevin, başvurduğu veritabanı nesnelerine bağlı olduğunu belirtir. Belirttiğinizde SCHEMABINDING, altta yatan nesneleri (örneğin bir görünüm veya tablo) fonksiyon tanımını etkileyecek şekilde değiştiremezsiniz. Değiştirmek istediğiniz nesneye bağımlılıkları kaldırmak için önce fonksiyon tanımını değiştirmeli veya kaldırmalısınız.
İşlevin başvurduğu nesnelere bağlanması, yalnızca aşağıdaki eylemlerden biri gerçekleştiğinde kaldırılır:
Fonksiyonu bırakıyorsun.
Fonksiyon
ALTERifadesini verip seçeneğiSCHEMABINDINGkaldır.
Bir fonksiyonu yalnızca aşağıdaki koşullar doğruysa şema bağlaması yapabilirsiniz:
Fonksiyonun referans verdiği kullanıcı tanımlı fonksiyonlar da şema sınırlıdır.
Fonksiyon, nesnelere iki parçalı bir isim kullanarak referans verir.
UDF'lerin gövdesi içinde, aynı veritabanındaki yerleşik fonksiyonlara ve diğer UDF'lere referans verebilirsiniz.
Ifadeyi
CREATE FUNCTIONçalıştıran kullanıcı, fonksiyonun referans verdiği veritabanı nesneleri üzerinde REFERENCES iznine sahiptir.
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. Bu özniteliği belirtmezseniz, CALLED ON NULL INPUT varsayılan olarak ima edilir ve fonksiyon gövdesi argüman olarak geçilse NULL bile çalıştırılır.
En iyi yöntemler
Eğer şema bağlamalı bir kullanıcı tanımlı fonksiyon oluşturmazsanız, altta yatan nesnelerdeki değişiklikler fonksiyonun tanımını etkileyebilir ve fonksiyonu çağırdığınızda beklenmedik sonuçlara yol açabilir.
WITH SCHEMABINDINGFonksiyonu ne zaman oluşturduğunuzda belirttiğinizde, sonraki değişikliklerin altta yatan nesnelerde fonksiyonun davranışını değiştiremeyeceğinden veya bozamayacağından emin olursunuz.Kullanıcı tanımlı fonksiyonlarınızı inline edilebilir şekilde yaz. Daha fazla bilgi için bkz. Skaler UDF'nin inlining sayfası.
Birlikte çalışabilirlik
Satır içi tablo değerli kullanıcı tanımlı işlevler
Bir hat içi tablo değerli fonksiyon yalnızca tek SELECT bir ifadeyi kabul eder.
Skaler kullanıcı tanımlı işlevler
Aşağıdaki deyimler skaler değerli bir işlevde geçerlidir:
- Atama deyimleri.
- Akış kontrolü ifadeleri hariç
TRY...CATCHveGO..TOifadeler. -
DECLAREyerel veri değişkenlerini tanımlayan ifadeler. - Tablolar/görünümler/iTVF'ler/diğer skaler UDF'lere referanslar.
Aşağıdaki yerleşik işlevler skaler değerli bir işlev gövdesinde desteklenmez:
Sınırlamalar
Uyarı
Geçerli önizleme sırasında sınırlamalar değiştirilebilir.
Veritabanı durumunu değiştiren eylemleri gerçekleştirmek için kullanıcı tanımlı fonksiyonları kullanamazsınız.
Kullanıcı tanımlı fonksiyonları iç içe koyabilirsiniz. Başka bir ifadeyle, kullanıcı tanımlı bir işlev başka bir işlev çağırabilir. İç içe işleme seviyesi, çağrılan fonksiyon çalıştırmaya başladığında artar, çağrılan fonksiyon yürütmeyi tamamladığında ise azalır. Fabric Data Warehouse olarak, bir UDF gövdesi bir tablo, görünüm veya satır içi tablo değerli fonksiyona referans verdiğinde kullanıcı tanımlı fonksiyonları dört seviyeye kadar iç içe geçirebilirsiniz; aksi takdirde 32 seviyeye kadar bir durum olabilir. Eğer maksimum iç içe alma seviyelerini aşarsanız, çağrı fonksiyon zinciri başarısız olur.
Skaler UDF'ler aşağıdaki durumlarda kullanıcı tablosundaki bir sorguda
SELECT ... FROMkullanılamaz:- UDF gövdesi, deterministik olmayan yerleşik fonksiyona (örneğin
GETDATE(), deterministik ve belirsiz fonksiyonlara bakınız) bir çağrı içerir. - UDF gövdesi veya
BREAKifadeyi içerirCONTINUE. - Bir özyinelemeli skaler UDF çağrısı var.
- UDF gövdesi, deterministik olmayan yerleşik fonksiyona (örneğin
Skaler UDF, CTE'ler gibi tüm sorgu şekillerinde ve
GROUP BYaşağıdaki durumlarda kullanılamaz:- Skaler UDF gövdesi tablolara/görünümlere/iTVF'lere/diğer skaler UDF'lere referans içerir.
- Skaler UDF, giriş parametresi, yerel değişken veya dönüş veri tipi olarak bu veri tiplerinden herhangi birini içerir: varchar(max), nvarchar(max), varbinary(max), binary(max).
- Skaler UDF gövdesi, yapay zeka fonksiyonlarına çağrılar içerir.
- Yukarıdaki senaryolarda, genel skaler udf inlining gereksinimleri için geçerlidir, bkz. Skaler UDF inlining gereksinimleri.
Bir skaler UDF aşağıdakilerden herhangi birini içeriyorsa, tek bir sorguda 10'dan fazla UDF çağrısı yapılırsa kullanıcı sorgusu başarısız olabilir:
- Skaler UDF gövdesi tablolara/görünümlere/iTVF'lere/diğer skaler UDF'lere referans içerir.
- Skaler UDF, giriş parametresi, yerel değişken veya dönüş veri tipi olarak bu veri tiplerinden herhangi birini içerir: varchar(max), nvarchar(max), varbinary(max), binary(max).
- Skaler UDF gövdesi, AI Fonksiyonlarına çağrılar içerir.
Desteklenmeyen herhangi bir senaryoda skaler UDF kullanıldığında, sorgu yürütme saatinde "
Scalar UDF execution is currently unavailable in this context." hata mesajı görürsünüz.
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ı fonksiyonların tanımını ve inlineability bilgilerini gösterir. Örneğin:
SELECT SCHEMA_NAME(o.schema_id) AS SchemaName, o.name AS FunctionName, m.definition AS FunctionDefinition, m.is_inlineable AS Inlineable, m.inline_eligibility_mask AS InlineEligibilityMask FROM sys.objects o JOIN sys.sql_modules m ON o.object_id = m.object_id WHERE o.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'nin inlining yapılması
Microsoft Fabric Data Warehouse, kullanıcı tanımlı kodu dağıtık bir şekilde derlemek ve çalıştırmak için farklı iç çizim teknikleri kullanır.
Skaler UDF'nin inline edilmesi varsayılan olarak etkinleştirilmiştir.
Bazı T-SQL söz dizimleri skaler UDF'nin satırlanamaz olmasını sağlar. Örneğin, UDF gövdesi içinde bir WHILE döngü ve bir tabloya referans veren fonksiyonlar iç çizimli olamaz.
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. Özellik, is_inlineable UDF tanımı içindeki sözdizimini kontrol etmekten kaynaklanır. Skaler UDF, derleme zamanından önce inline yapılmaz.
Özellik, inline_eligibility_mask UDF için hangi tür inlining uygulanabileceğini açıklar.
- ' değeri
0, UDF'nin sınırsız olmadığı anlamına gelir. - Değeri,
1UDF'nin Skaler UDF inliningine uygun olduğunu gösterir. - Değeri,
2UDF'nin ifade bloğu yoluyla inline yapılmaya uygun olduğu anlamına gelir. - Değeri,
3UDF'nin her iki inlining tekniği için de uygun olduğu anlamına gelir.
Eğer skaler bir UDF inlineable ise, sorgu derlendiğinde her zaman inline olarak olduğunu garanti etmez.
Fabric Data Warehouse, hangi inlining tekniğini uygulayacağına (sorgu başlıcası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 fonksiyon içinde sys.sql_modules.is_inlineablesatırlanabilir değilse, örneğin bir değişken ayarlamak için sorguyu bağımsız bir çağrı olarak çalıştırabilirsiniz. Ancak skaler fonksiyon kullanıcı tablosunda bir SELECT ... FROM sorguya dahil 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ı fonksiyon, belirsiz bir sistem fonksiyonu kullanıldığı için inlineable değildir. SYSUTCDATETIME() Kullanıcı tablosunda bir SELECT ... FROM sorguda kullanıldığında başarısız olur, ancak bağımsız bir ç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, modüller üzerindeki anahtar bilgileri parametreye objectType göre filtreleyen satır içi tablo değerli bir fonksiyon oluşturur. Parametreyle fonksiyonu DEFAULT çağırdığınızda tüm modülleri döndürmek için varsayılan bir değer içerir. Bu örnek, Metadata'da bahsedilen bazı sistem kataloğu görünümlerini 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
Tüm satır içi tablo değerli fonksiyonları döndürmek için fonksiyonu çağırın (IF):
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, daha önce oluşturulmuş satıriçi TVF'yi kullanarak sonuçları diğer tablolarla nasıl CROSS APPLYbirleştirebileceğinizi gösterir. Burada, her iki sys.objects sütundan da tüm sütunları ve sütundaki tüm ModulesByType satırlar için sonuçları type seçersiniz. Kullanımı APPLYhakkında daha fazla bilgi için FROM maddesi ve JOIN, APPLY, PIVOT (Transact-SQL) bölümlerine bakınız.
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 for Fabric Data Warehouse versiyonuna CREATE FUNCTION 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 ifadeyi kullanarak tekrar kullanılabilir bir rutin oluşturun ve bu şekilde kullanabilirsiniz:
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ı. Fonksiyon isimleri, tanımlayıcı kurallarına uymalı ve veritabanı ile şeması içinde benzersiz olmalıdır.
Uyarı
Parametre belirtmeseniz bile fonksiyon adından sonra parantez eklemeniz gerekir.
@ parameter_name
Kullanıcı tanımlı işlevdeki bir parametre. Bir veya daha fazla parametre ilan edebilirsiniz.
Bir fonksiyonun en fazla 2.100 parametresi olabilir. Bir kullanıcı veya uygulama bir fonksiyon çağırdığında, her ilan edilen parametrenin değeri, parametre için varsayılan bir tanımlanmadıkça sağlanmalıdır.
İlk karakter olarak at işareti (@) kullanarak bir parametre adı belirtin. Parametre adı, tanımlayıcılar için gereken kuralları takip etmelidir. Parametreler fonksiyona göre lokaldir; Aynı parametre isimlerini diğer fonksiyonlarda da kullanabilirsiniz. Parametreler yalnızca sabitlerin yerini alabilir; Tablo isimleri, sütun adları veya diğer veritabanı nesnelerinin adları yerine kullanılamazlar.
Uyarı
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şkeni char(3) olarak tanımlarsanız ve ardından üç karakterden büyük bir değere ayarsanız, veri tanımlanmış boyuta kısılır ve INSERT or UPDATE ifadesi 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ı (sıralı versiyon) veri tipi desteklenen bir tür değildir.
[ = varsayılan ]
Parametre için varsayılan değer. Varsayılan bir değer tanımlarsanız, o parametre için bir değer belirtmeden fonksiyonu çalıştırabilirsiniz.
Fonksiyonun bir parametresi varsayılan değere sahipse, varsayılan değeri almak için fonksiyonu çağırırken anahtar kelimeyi DEFAULT belirtmelisiniz. 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 tipi desteklenen bir tip değildir. İmleç ve tablo skaler olmayan tipler yasaktır.
function_body
Transact-SQL deyimleri dizisi.
function_body bir SELECT ifade içeremez ve veritabanı verilerine referans veremez.
function_body tablolara veya görüşlere referans veremez. Fonksiyon gövdesi diğer deterministik fonksiyonları çağırabilir ama deterministik olmayan fonksiyonları ç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 fonksiyon için fonksiyon gövdesi yoktur; tablo, tek SELECT bir ifadenin sonuç kümesidir.
TABLE
Tablo değerli işlevin (TVF) döndürülen değerinin bir tablo olduğunu belirtir. TVF'lere sadece sabitleri ve @local_variables verebilirsiniz.
Inline TVF'lerde (önizleme), geri dönüş değeri tek TABLE bir ifadeyle tanımlanırSELECT. 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. Belirttiğinizde SCHEMABINDING, altta yatan nesneleri (örneğin bir görünüm veya tablo) fonksiyon tanımını etkileyecek şekilde değiştiremezsiniz. Değiştirmek istediğiniz nesneye bağımlılıkları kaldırmak için önce fonksiyon tanımını değiştirmeli veya kaldırmalısınız.
İşlevin başvurduğu nesnelere bağlanması, yalnızca aşağıdaki eylemlerden biri gerçekleştiğinde kaldırılır:
Fonksiyonu bırakıyorsun.
Fonksiyon
ALTERifadesini verip seçeneğiSCHEMABINDINGkaldır.
Bir fonksiyonu yalnızca aşağıdaki koşullar doğruysa şema bağlaması yapabilirsiniz:
Fonksiyonun referans verdiği kullanıcı tanımlı fonksiyonlar da şema sınırlıdır.
Fonksiyon referansları bir veya iki parçalı isimler kullanır.
UDF'lerin gövdesi içinde, aynı veritabanındaki yerleşik fonksiyonlara ve diğer UDF'lere referans verebilirsiniz.
Ifadeyi
CREATE FUNCTIONçalıştıran kullanıcı, fonksiyonun referans verdiği veritabanı nesneleri üzerinde REFERENCES iznine sahiptir.
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. Bu özniteliği belirtmezseniz, CALLED ON NULL INPUT varsayılan olarak ima edilir ve fonksiyon gövdesi argüman olarak geçilse NULL bile çalıştırılır.
En iyi yöntemler
SCHEMABINDING maddesiyle kullanıcı tanımlı bir fonksiyon oluşturmazsanız, temel nesnelerdeki değişiklikler fonksiyonun tanımını etkileyebilir ve çağrıldığınızda beklenmedik sonuçlara yol açabilir. Fonksiyonu oluştururken maddeyi WITH SCHEMABINDING belirtin. Bu madde, fonksiyon tanımında referans verilen nesneleri değiştiremeyeceğinizi garanti eder, ancak fonksiyonu da değiştirmezsiniz.
Birlikte çalışabilirlik
Aşağıdaki deyimler skaler değerli bir işlevde geçerlidir:
Atama deyimleri.
Akış kontrolü ifadeleri, TRY hariç... CATCH ifadeleri.
Yerel veri değişkenlerini tanımlayan DECLARE ifadeleri.
Bir hat içi tablo değerli fonksiyonda (önizleme) yalnızca tek bir select ifadesi kullanılabilir.
Sınırlamalar
Veritabanı durumunu değiştiren eylemleri gerçekleştirmek için kullanıcı tanımlı fonksiyonları kullanamazsınız.
Kullanıcı tanımlı fonksiyonları iç içe koyabilirsiniz. Bir kullanıcı tarafından tanımlanan fonksiyon diğerini çağırabilir. İç içe işleme seviyesi, çağrılan fonksiyon çalıştırmaya başladığında artar, çağrılan fonksiyon yürütmeyi tamamladığında ise azalır. Eğer maksimum iç içe geçme seviyelerini aşarsanız, tüm çağrı fonksiyon zinciri başarısız olur.
Azure Synapse Analytics'te sunucusuz SQL havuzunuzun veritabanında fonksiyonlar master dahil nesneler oluşturamazsınız.
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 izin ve fonksiyonun oluşturulduğu şema üzerinde ALTER izni gerektirir CREATE FUNCTION .
Örnekler
A. Veri türünü değiştirmek için skaler değerli kullanıcı tanımlı bir işlev kullanma
Bu basit fonksiyon, bir int veri tipini giriş olarak alır ve çıktı olarak ondalık (10,2) veri tipi 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 fonksiyonlar sunucusuz SQL havuzlarında mevcut değildir.
B. Satır içi tablo değerli işlev oluşturma
Aşağıdaki örnek, modüller üzerindeki anahtar bilgileri parametreye objectType göre filtreleyen satır içi tablo değerli bir fonksiyon oluşturur. Parametreyle fonksiyonu DEFAULT çağırdığınızda tüm modülleri döndürmek için varsayılan bir değer içerir. Bu örnek, Metadata'da bahsedilen bazı sistem kataloğu görünümlerini 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
Tüm görünüm (V) nesnelerini döndürmek için fonksiyonu çağırabilirsiniz:
select * from dbo.ModulesByType('V');
Uyarı
Satır içi tablo-değer fonksiyonları sunucusuz SQL havuzlarında mevcuttur, ancak özel 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, daha önce oluşturulmuş satıriçi TVF'yi kullanarak sonuçları diğer tablolarla nasıl CROSS APPLYbirleştirebileceğinizi gösterir. Bu örnekte, her ikisinden sys.objects de tüm sütunları ve sütundaki ModulesByType tüm satırlar için sonuçları type seçersiniz. Kullanımı APPLYhakkında daha fazla bilgi için FROM maddesi ve JOIN, APPLY, PIVOT (Transact-SQL) bölümlerine bakınız.
SELECT *
FROM sys.objects o
CROSS APPLY dbo.ModulesByType(o.type);
GO
Uyarı
Satır içi tablo-değer fonksiyonları sunucusuz SQL havuzlarında mevcuttur, ancak özel SQL havuzlarında önizleme aşamasındadır.