CREATE FUNCTION

Ş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/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
  • Kontrol akış ifadeleri (WHILE dö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 ALTER ifadesini verip seçeneği SCHEMABINDING kaldı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 SCHEMABINDING Fonksiyonu 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

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 ... FROM kullanı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 BREAK ifadeyi içerirCONTINUE.
    • Bir özyinelemeli skaler UDF çağrısı var.
  • Skaler UDF, CTE'ler gibi tüm sorgu şekillerinde ve GROUP BY aş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, 1 UDF'nin Skaler UDF inliningine uygun olduğunu gösterir.
  • Değeri, 2 UDF'nin ifade bloğu yoluyla inline yapılmaya uygun olduğu anlamına gelir.
  • Değeri, 3 UDF'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';

Ş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 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 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 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 ALTER ifadesini verip seçeneği SCHEMABINDING kaldı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.

Sonraki adım