Aracılığıyla paylaş


Fonksiyon Oluştur

Ş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/ELSE ve BEGIN/END bloklar)
  • 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
  • SELECT deyimleri 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 FUNCTION baş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 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.

  • 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...CATCH Akış Denetimi deyimleri
    • DECLARE yerel 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 ... FROM kullanılamaz:

  • Aşağıdaki durumlarda Skaler UDF'ler sorguda kullanılamaz:

    • UDF doğrudan bir GROUP BY yan tümcesinde çağrılır.
    • UDF doğrudan bir ORDER BY yan tümcesinde çağrılır.
    • çağıran sorgu ortak bir tablo ifadesi (CTE) içeriyor.
  • Ö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';

Şunlar için geçerlidir: Azure Synapse AnalyticsAnalytics Platform Sistemi (PDW)

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 FUNCTION satı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 FUNCTION satı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 FUNCTION baş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.

Sonraki adım