Kullanıcı tanımlı işlevler

Şunlar için geçerlidir:SQL ServerAzure SQL VeritabanıAzure SQL Yönetilen ÖrneğiMicrosoft Fabric'te SQL analiz uç noktasıMicrosoft Fabric'te ambarMicrosoft Fabric'te SQL veritabanı

Programlama dillerindeki işlevler gibi SQL Server kullanıcı tanımlı işlevler de parametreleri kabul eden, karmaşık bir hesaplama gibi bir eylem gerçekleştiren ve bu eylemin sonucunu değer olarak döndüren yordamlardır. Dönüş değeri tek bir skaler değer veya sonuç kümesi olabilir.

Kullanıcı tanımlı işlevlerin avantajları

Kullanıcı tanımlı işlevler (UDF) neden kullanılır?

  • Modüler programlama. İşlevi bir kez oluşturabilir, veritabanında depolayabilir ve programınızda istediğiniz sayıda çağırabilirsiniz. Kullanıcı tanımlı işlevler, program kaynak kodundan bağımsız olarak değiştirilebilir.

  • Daha hızlı yürütme. Saklı yordamlara benzer şekilde, Transact-SQL kullanıcı tanımlı işlevler planları önbelleğe alarak ve yinelenen yürütmeler için yeniden kullanarak Transact-SQL kodun derleme maliyetini azaltır. Bu, kullanıcı tanımlı işlevin her kullanımda yeniden ayrıştırılması ve yeniden iyileştirilmesine gerek olmadığı anlamına gelir ve bu da yürütme sürelerinin daha hızlı olmasına neden olur.

    Ortak dil çalışma zamanı (CLR) işlevleri hesaplama görevleri, dize işleme ve iş mantığı için Transact-SQL işlevlere göre önemli performans avantajı sunar. Transact-SQL işlevleri, yoğun veri erişimli mantık için daha uygundur.

  • Ağ trafiğini azaltın. Tek bir skaler ifadede ifade edilmeyecek bazı karmaşık kısıtlamalara göre verileri filtreleyen bir işlem işlev olarak ifade edilebilir. İşlev, istemciye gönderilen satır sayısını azaltmak için WHERE yan tümcesinde çağrılabilir.

Önemli

Sorgulardaki Transact-SQL UDF'ler yalnızca tek bir iş parçacığında (seri yürütme planı) yürütülebilir. Bu nedenle UDF'lerin kullanılması paralel sorgu işlemeyi engeller. Paralel sorgu işleme hakkında daha fazla bilgi için bkz. Sorgu İşleme Mimarisi Kılavuzu.

İşlev türleri

Bu bölümde skaler işlevler, tablo değerli işlevler ve sistem işlevleri arasındaki farklar açıklanmaktadır.

Skaler işlevler

Kullanıcı tanımlı skaler işlevler, RETURNS yan tümcesinde tanımlanan türde tek bir veri değeri döndürür. Satır içi skaler işlev için, döndürülen skaler değer tek bir deyimin sonucudur. Çok durumlu skaler bir işlev için işlev gövdesi, tek değeri döndüren bir dizi Transact-SQL deyimi içerebilir. Dönüş türü metin, ntext, resim, imleç ve zaman damgası dışında herhangi bir veri türü olabilir. Örnekler için bkz. Kullanıcı tanımlı işlevler (veritabanı altyapısı) oluşturma.

Tablo değerli fonksiyonlar

Kullanıcı tanımlı tablo değerli işlevler (TVF'ler) bir tablo veri türü döndürür. Satır içi tablo değerli bir işlev için işlev gövdesi yoktur; tablo, tek bir SELECT deyiminin sonuç kümesidir. Örnekler için bkz. Kullanıcı tanımlı işlevler (veritabanı altyapısı) oluşturma.

Sistem işlevleri

SQL Server, çeşitli işlemleri gerçekleştirmek için kullanabileceğiniz birçok sistem işlevi sağlar. Değiştirilemezler. Daha fazla bilgi için bkz. SQL veritabanı işlevleri nelerdir?, Transact-SQL için kategoriye göre Sistem İşlevleri ve Sistem dinamik yönetim görünümleri.

Yönergeler

Transact-SQL bir deyimin iptal edilmesine ve modüldeki bir sonraki deyimle (tetikleyiciler veya saklı yordamlar gibi) devam etmelerine neden olan hatalar bir işlev içinde farklı şekilde ele alınır. İşlevlerde bu tür hatalar işlevin yürütülmesinin durmasına neden olur. Bu da işlevi çağıran deyiminin iptal edilmesine neden olur.

BEGIN...END blokundaki ifadeler herhangi bir yan etki yapamaz. İşlev yan etkileri, veritabanı tablosunda değişiklik yapma gibi işlevin dışında bir kapsama sahip olan bir kaynağın durumunda yapılan kalıcı değişikliklerdir. İşlevdeki deyimlerin yapabilecekleri tek değişiklik, yerel imleçler veya değişkenler gibi işlevde yerel nesnelerde yapılan değişikliklerdir. Veritabanı tablolarında yapılan değişiklikler, işlevde yerel olmayan imleçlerdeki e-posta gönderme, katalog değişikliğini deneme ve kullanıcıya döndürülen bir sonuç kümesi oluşturma gibi işlemler, işlevde gerçekleştirilemez eylemlere örnek olarak verilebilir.

Eğer bir CREATE FUNCTION ifadesi, verildiğinde mevcut olmayan kaynaklar üzerinde yan etkiler oluşturursa, SQL Server bu ifadeyi yürütür. Ancak SQL Server çağrıldığında işlevi yürütmez.

Sorguda belirtilen bir işlevin yürütüliş sayısı, iyileştirici tarafından oluşturulan yürütme planları arasında farklılık gösterebilir. Bir yan tümcedeki bir alt sorgu tarafından çağrılan bir WHERE işlev buna örnektir. Alt sorgunun ve işlevinin yürütüliş sayısı, iyileştirici tarafından seçilen farklı erişim yollarına göre farklılık gösterebilir.

Belirleyici işlevler şemaya bağlı olmalıdır. Deterministik bir işlev oluştururken yan tümcesini SCHEMABINDING kullanın.

Kullanıcı tanımlı işlevler hakkında daha fazla bilgi ve performans konuları için bkz. Kullanıcı tanımlı işlevler (Veritabanı Altyapısı) oluşturma.

İşlevde geçerli deyimler

İşlevde geçerli olan deyim türleri şunlardır:

  • DECLARE deyimleri, işlevin yerel veri değişkenlerini ve imleçlerini tanımlamak için kullanılabilir.

  • İşleve yerel nesnelere değerler atanması, skaler ve tablo yerel değişkenlerine SET ile değer atamak gibi işlemleri içerir.

  • İşlevde bildirilen, açılan, kapatılan ve serbest bırakılan yerel imleçlere başvuran imleç işlemleri. FETCH istemciye veri döndüren deyimlere izin verilmez. Yalnızca FETCH yan tümcesini INTO kullanarak yerel değişkenlere değer atayan deyimlere izin verilir.

  • TRY...CATCH ifadeleri hariç akış kontrolü ifadeleri.

  • SELECT işlevine yerel olan değişkenlere değer atayan ifadelere sahip seçme listeleri içeren deyimler.

  • UPDATE, INSERTve DELETE deyimleri işlevinde yerel olan tablo değişkenlerini değiştirir.

  • EXECUTE genişletilmiş saklı prosedürü çağıran deyimler.

Yerleşik sistem işlevleri

Aşağıdaki belirsiz yerleşik işlevler Transact-SQL kullanıcı tanımlı işlevlerde kullanılabilir.

  • CURRENT_TIMESTAMP
  • GET_TRANSMISSION_STATUS
  • GETDATE
  • GETUTCDATE
  • @@CONNECTIONS
  • @@CPU_BUSY
  • @@DBTS
  • @@IDLE
  • @@IO_BUSY
  • @@MAX_CONNECTIONS
  • @@PACK_RECEIVED
  • @@PACK_SENT
  • @@PACKET_ERRORS
  • @@TIMETICKS
  • @@TOTAL_ERRORS
  • @@TOTAL_READ
  • @@TOTAL_WRITE

Aşağıdaki belirsiz yerleşik işlevler Transact-SQL kullanıcı tanımlı bir işlevde (UDF) kullanılamaz .

  • NEWID
  • NEWSEQUENTIALID
  • RAND
  • TEXTPTR

UDF içinde bu işlevlerden birine başvurursanız aşağıdaki hatayı alırsınız:

Msg 443, Level 16, State 1
Invalid use of a side-effecting operator <operator> within a function.

Belirleyici ve belirsiz yerleşik sistem işlevlerinin listesi için bkz. Deterministic ve nondeterministic functions.

Şemaya bağlı işlevler

CREATE FUNCTION işlevi, tablolar, görünümler ve diğer kullanıcı tanımlı işlevler gibi başvurduğunu nesnelerin şemasına bağlayan bir SCHEMABINDING yan tümceyi destekler. Şemaya bağlı bir işlev tarafından başvuruda bulunan herhangi bir nesneyi değiştirme veya bırakma girişimi başarısız olur.

SCHEMABINDING içinde belirtebilmeniz için önce bu koşulların karşılanması gerekir:

  • İşlev tarafından başvuruda bulunılan tüm görünümler ve kullanıcı tanımlı işlevler şemaya bağlı olmalıdır.

  • İşlev tarafından başvuruda bulunılan tüm nesneler işlevle aynı veritabanında olmalıdır. Nesnelere tek parçalı veya iki parçalı adlar kullanılarak başvurulmalıdır.

  • İşlevde başvuruda bulunan tüm nesneler (tablolar, görünümler ve kullanıcı tanımlı işlevler) üzerinde izniniz olmalıdır REFERENCES .

Şema bağlamasını kaldırmak için kullanabilirsiniz ALTER FUNCTION . ALTER FUNCTION işlevi, WITH SCHEMABINDING belirtmeden yeniden tanımlamalıdır.

Parametreleri belirtme

Kullanıcı tanımlı bir işlev sıfır veya daha fazla giriş parametresi alır ve bir skaler değer veya tablo döndürür. Bir işlevin en fazla 1.024 giriş parametresi olabilir. İşlevin bir parametresi varsayılan değere sahip olduğunda, varsayılan değeri almak için işlevi çağırırken anahtar sözcüğü DEFAULT belirtilmelidir. Bu davranış, parametrenin atlanması varsayılan değeri de ifade eden kullanıcı tanımlı saklı yordamlarda varsayılan değerlere sahip parametrelerden farklıdır. Kullanıcı tanımlı işlevler çıkış parametrelerini desteklemez.