SQL Server'da İşlev ve Saklı Yordam Karşılaştırması


830

İşlevleri ve Saklı Yordamı uzun süredir öğreniyorum ama neden ve ne zaman bir işlevi veya saklı yordamı kullanmam gerektiğini bilmiyorum. Bana benziyorlar, belki de bunun hakkında biraz acemi olduğum için.

Birisi bana nedenini söyleyebilir mi?





3
hıza ne dersin? hangisi aynı sorguyu daha hızlı çalıştırır?
AmiNadimi

Yanıtlar:


709

Fonksiyonlar hesaplanan değerlerdir ve üzerinde kalıcı çevresel değişiklikler yapamazlar SQL Server(yani, hayır INSERTveya UPDATEifadelere izin verilmez).

Bir işlev, SQLbir skaler değer döndürürse ifadelerde satır içi kullanılabilir veya bir sonuç kümesi döndürürse birleştirilebilir.

Cevabı özetleyen yorumlardan kayda değer bir nokta. @Sean K Anderson'a teşekkürler:

İşlevler, bilgisayar bilimi tanımını izleyerek bir değer döndürmesi ZORUNLUDUR ve aldıkları verileri parametre olarak değiştiremezler (bağımsız değişkenler). İşlevlerin hiçbir şeyi değiştirmesine izin verilmez, en az bir parametresi olmalıdır ve bir değer döndürmelidir. Depolanan işlemcilerin bir parametresi olması gerekmez, veritabanı nesnelerini değiştirebilir ve bir değer döndürmek zorunda değildir.

Çağırmak nasıl SQLyerine saklı yordam bir işlevi kullandığınızda mağaza prosedüründen fonksiyon ve.

Merhaba arkadaşlar, bugün saklı yordamı ne zaman ve işlevi ne zaman kullanacağımızı tartışacağız. Basit takımda Bazı değerleri hesaplamak istiyorsanız ve bu tek bir değer döndürürse, gerekli değildir:

https://programmingtechtutorial.blogspot.com/2020/01/when-use-storeprocedure-and-when-use.html


13
Temelde hiçbir DML'ye izin verilmiyor mu?
david blaine

173
İşlevler, bilgisayar bilimi tanımını izleyerek bir değer döndürmesi ZORUNLUDUR ve aldıkları verileri parametre olarak değiştiremezler (argümanlar). İşlevlerin hiçbir şeyi değiştirmesine izin verilmez, en az bir parametresi olmalıdır ve bir değer döndürmelidir. Depolanan işlemcilerin bir parametreye sahip olması gerekmez, veritabanı nesnelerini değiştirebilir ve bir değer döndürmek zorunda değildir.
Sean Anderson

23
Aslında, yerel tablo değişkenlerini değiştirmek için bir işlevde INSERT, UPDATE ve DELETE deyimlerine sahip olabilirsiniz.
Ani

14
@Ani - Bir işlevde istediğiniz sayıda yerel değişkeni başlatabilir ve değiştirebilirsiniz, ancak işlevin kapsamı dışında hiçbir şeyi değiştiremezsiniz.
MyItchyChin

40
@SeanKAnderson işlevi "en az bir parametreye sahip olmalı" doğru değil.
Liang

623

SP ve UDF arasındaki fark aşağıda listelenmiştir:

+---------------------------------+----------------------------------------+
| Stored Procedure (SP)           | Function (UDF - User Defined           |
|                                 | Function)                              |
+---------------------------------+----------------------------------------+
| SP can return zero , single or  | Function must return a single value    |
| multiple values.                | (which may be a scalar or a table).    |
+---------------------------------+----------------------------------------+
| We can use transaction in SP.   | We can't use transaction in UDF.       |
+---------------------------------+----------------------------------------+
| SP can have input/output        | Only input parameter.                  |
| parameter.                      |                                        |
+---------------------------------+----------------------------------------+
| We can call function from SP.   | We can't call SP from function.        |
+---------------------------------+----------------------------------------+
| We can't use SP in SELECT/      | We can use UDF in SELECT/ WHERE/       |
| WHERE/ HAVING statement.        | HAVING statement.                      |
+---------------------------------+----------------------------------------+
| We can use exception handling   | We can't use Try-Catch block in UDF.   |
| using Try-Catch block in SP.    |                                        |
+---------------------------------+----------------------------------------+

21
İşlevler bir değer veya bir küme döndürmelidir.
Rafareino

8
Bu 3 yıl sonra geldi ama üstte olmalı çünkü hem okunabilir hem de kapsamlı.
DanteTheSmith

SP hem geçici tabloları hem de tablo değişkenlerini kullanabilirken, UDF yalnızca tablo değişkenlerini kullanabilir. Sırasıyla tablo değişkenleri dizin kullanamaz. UDF, SP'den farklı bir ÇAPRAZ UYGULAMADA çağrılabilir
Ludovic Aubert

190

Fonksiyonlar ve saklı prosedürler ayrı amaçlara hizmet eder. En iyi benzetme olmasa da, işlevler herhangi bir programlama dilinde kullanacağınız diğer işlevler olarak tam olarak görüntülenebilir, ancak depolanan procs daha çok bireysel programlar veya toplu komut dosyası gibidir.

Fonksiyonlar normalde bir çıkışa ve isteğe bağlı olarak girişlere sahiptir. Çıkış daha sonra başka bir işleve giriş olarak (DATEDIFF, LEN, vb. Yerleşik bir SQL Server) veya bir SQL Sorgusu yüklemi olarak kullanılabilir - örn., SELECT a, b, dbo.MyFunction(c) FROM tableVeya SELECT a, b, c FROM table WHERE a = dbo.MyFunc(c).

Depolanmış procs, bir işlemde SQL sorgularını birbirine bağlamak ve dış dünyayla arayüz oluşturmak için kullanılır. ADO.NET, vb. Gibi çerçeveler doğrudan bir işlevi çağıramaz, ancak saklanan bir işlemi doğrudan çağırabilir.

Bununla birlikte işlevlerin gizli bir tehlikesi vardır: kötüye kullanılabilir ve oldukça kötü performans sorunlarına neden olabilir: bu sorguyu göz önünde bulundurun:

SELECT * FROM dbo.MyTable WHERE col1 = dbo.MyFunction(col2)

MyFunction şöyle bildirilir:

CREATE FUNCTION MyFunction (@someValue INTEGER) RETURNS INTEGER
AS
BEGIN
   DECLARE @retval INTEGER

   SELECT localValue 
      FROM dbo.localToNationalMapTable
      WHERE nationalValue = @someValue

   RETURN @retval
END

Burada olan şey, MyTable tablosundaki her satır için MyFunction işlevinin çağrılmasıdır. MyTable'da 1000 satır varsa, bu veritabanına karşı başka bir 1000 ad-hoc sorgudır. Benzer şekilde, işlev sütun belirtiminde belirtildiğinde çağrılırsa, SELECT tarafından döndürülen her satır için işlev çağrılır.

Bu yüzden yazma işlevlerine dikkat etmelisiniz. Bir işlevdeki bir tablodan SELECT yaparsanız, kendinize daha iyi depolanmış proc veya başka bir SQL yapısında (CASE ... NE ... ... BAŞKA ... SON).


2
"ADO.NET gibi çerçeveler doğrudan bir işlevi çağıramıyor" konusunu açıklayabilir misiniz? ADO.NET veri sağlayıcıları ile hiçbir sorun olmadan fonksiyonları yürüttüm.
Ian Kemp

24
Bir işlevi bazı SELECT deyimi aracılığıyla çağırmanız gerekir - bir işlev kendi başına bağımsız bir kod parçası olarak çağrılamaz - bu SQL deyimi daha fazla bir şey olmasa bile, daha büyük bir SQL deyiminin parçası olarak çağrılmalıdır. daha SELECT * from dbo.MyTableValuedFunction(). SPROCs Öte yanda ayarlayarak ADO.NET ile doğrudan çağrılabilir SqlCommand.CommandTypeiçin CommandType.StoredProcedure.
Chris J

60

Saklı yordamlar ve kullanıcı tanımlı işlevler arasındaki farklar:

  • Saklı yordamlar Select deyimlerinde kullanılamaz.
  • Saklı yordamlar, Ertelenmiş Ad Çözümlemeyi destekler.
  • Saklı yordamlar genellikle iş mantığını gerçekleştirmek için kullanılır.
  • Saklı yordamlar herhangi bir veri türünü döndürebilir.
  • Saklı yordamlar, kullanıcı tanımlı işlevlerden daha fazla sayıda giriş parametresi kabul edebilir. Saklı yordamlar 21.000'e kadar giriş parametresine sahip olabilir.
  • Saklı yordamlar Dinamik SQL çalıştırabilir.
  • Saklı yordamlar hata işlemeyi destekler.
  • Deterministik olmayan fonksiyonlar saklı prosedürlerde kullanılabilir.

  • Kullanıcı tanımlı işlevler Select deyimlerinde kullanılabilir.
  • Kullanıcı tanımlı işlevler Ertelenmiş Ad Çözümlemeyi desteklemez.
  • Kullanıcı tanımlı işlevler genellikle hesaplamalar için kullanılır.
  • Kullanıcı tanımlı işlevler bir değer döndürmelidir.
  • Kullanıcı tanımlı işlevler Görüntüler döndüremez.
  • Kullanıcı tanımlı işlevler, saklı yordamlardan daha az sayıda giriş parametresini kabul eder. UDF'lerde en fazla 1.023 giriş parametresi bulunabilir.
  • Geçici tablolar kullanıcı tanımlı işlevlerde kullanılamaz.
  • Kullanıcı tanımlı işlevler Dinamik SQL çalıştıramaz.
  • Kullanıcı tanımlı işlevler hata işlemeyi desteklemez. RAISEERRORVEYA @@ERRORUDF'lerde izin verilmez.
  • Deterministik olmayan fonksiyonlar UDF'lerde kullanılamaz. Örneğin, GETDATE()UDF'lerde kullanılamaz.

1
@CuriousBoy alıntı için yeniden. başka bir kredisiz cevap (@Ankit tarafından) (<- nasıl yaptım bakın?;)): "Kaynak referans vermelisiniz . Bu ( blogs.msdn.microsoft.com/pradeepsvs/2014/10 adresinden / 08 /… ). Lütfen başkalarının yaptığı işe saygı gösterin! "
Tom

7
Bu Bloglar 8 Ekim 2014'ten beri yazılmıştır ve bu cevap 2 Mayıs 2013'ten beri yazılmıştır.
Kumar Manish

1
@Code Rider: Ah, özür dilerim! Bunu fark etmediğime inanamıyorum! Blog, sizi (veya başka birisini) kredisiz olarak kopyaladı mı?
Tom

GETDATE()bir İşlevde kullanılabilir. Deterministik olmayan pivot iyi bir şey değildir.
PerformanceDBA

56

Diğer SQL deyimlerinde kullanmak üzere bir değer hesaplamak ve döndürmek istediğinizde kullanıcı tanımlı bir işlev yazın; Bunun yerine saklı bir yordam yazmak istediğinizde karmaşık bir SQL deyimi grubunu gruplandırmaktır. Sonuçta bunlar oldukça farklı iki kullanım durumu!


18
farklı kullanıcı tanımlı fonksiyon türleri vardır. Skaler olanlar yalnızca değer döndürür; diğer türler retrun sonuç kümeleri.
AK

44
              STORE PROCEDURE                 FUNCTION (USER DEFINED FUNCTION)    
 * Procedure can return 0, single or   | * Function can return only single value   
   multiple values.                    |
                                       |
 * Procedure can have input, output    | * Function  can have only input 
   parameters.                         |   parameters.         
                                       |
 * Procedure cannot be called from     | * Functions can be called from 
   function.                           |   procedure.
                                       |
 * Procedure allows select as well as  | * Function allows only select statement 
   DML statement in it.                |   in it.
                                       |
 * Exception can be handled by         | * Try-catch block cannot be used in a 
   try-catch block in a procedure.     |   function.
                                       |
 * We can go for transaction management| * We can't go for transaction 
   in procedure.                       |   management in function.
                                       |
 * Procedure cannot be utilized in a   | * Function can be embedded in a select 
   select statement                    |   statement.
                                       |
 * Procedure can affect the state      | * Function can not affect the state 
   of database means it can perform    |   of database means it can not    
   CRUD operation on database.         |   perform CRUD operation on 
                                       |   database. 
                                       |
 * Procedure can use temporary tables. | * Function can not use 
                                       |   temporary tables. 
                                       |
 * Procedure can alter the server      | * Function can not alter the  
   environment parameters.             |   environment parameters.
                                       |   
 * Procedure can use when we want      | * Function can use when we want
   instead is to group a possibly-     |   to compute and return a value
   complex set of SQL statements.      |   for use in other SQL 
                                       |   statements.

1
UDF, SP'den farklı olarak bir ÇAPRAZ UYGULAMADA çağrılabilir
Ludovic Aubert

24

Temel Fark

İşlev bir değer döndürmelidir, ancak Saklı Yordamda isteğe bağlıdır (Yordam sıfır veya n değeri döndürebilir).

Fonksiyonlar sadece girdi parametrelerine sahipken, Prosedürler girdi / çıktı parametrelerine sahip olabilir.

İşlev bir giriş parametresini alır, zorunludur ancak Saklı Yordam o ila n giriş parametresini alabilir.

Fonksiyonlar Prosedürden çağrılabilirken, Prosedürler Fonksiyondan çağrılamaz.

Gelişmiş Fark

Yordam, SELECT öğesinin yanı sıra DML (INSERT / UPDATE / DELETE) ifadesine izin verirken, İşlev yalnızca SELECT ifadesine izin verir.

Yordamlar SELECT deyiminde kullanılamazken, İşlev SELECT deyimine katıştırılabilir.

Saklı Yordamlar SQL ifadelerinde WHERE / HAVING / SELECT bölümünün herhangi bir yerinde kullanılamazken, İşlev kullanılabilir.

Tabloları döndüren işlevler başka bir satır kümesi olarak ele alınabilir. Bu, diğer tablolarla JOIN'lerde kullanılabilir.

Satır İçi İşlevi, parametreleri alan görünümler olabilir ve JOIN'lerde ve diğer Satır Kümesi işlemlerinde kullanılabilir.

İstisna, try-catch bloğu bir Fonksiyonda kullanılamazken, istisna bir Prosedürdeki try-catch bloğu tarafından işlenebilir.

İşlem Yönetimi'ne Prosedürde gidebiliriz, Fonksiyona giremeyiz.

kaynak


25
Kaynak referansını vermiş olmalısınız. Bu dotnet-tricks.com/Tutorial/sqlserver/… adresinden alınmıştır . Lütfen başkalarının yaptığı işe saygı gösterin!
curiousBoy

16
Kaynak referans vermemek için bir neden değildir. Sonunda bahsedebilirsin!
curiousBoy

2
Yeniden. ".... işlev bir değer döndürmesi gerekir ama saklı yordam o isteğe bağlıdır": Bunu açıklamak istiyorum: Fonksiyonlar" olmalıdır sadece ve sadece bir değeri döndürür (aracılığıyla yapılmalıdır Returnsanahtar kelime ve bir Skaler veya Masa türü olmalıdır) , ancak Saklı Yordamlar isteğe bağlı olarak aşağıdakileri döndürebilir: a) IntDeyim yoluyla 1 tip Sonuç Kodu Returnve / veya b) Anahtar kelime ile 1+ Parametreler (tür dahil Cursor) Outputve / veya c) 1+ SelectDeyimler yoluyla Satır Setleri . döndürüldüğünde, "Ekleme" İfadesi "nin" execute_statement "bağımsız değişkeni olarak kullanılabilir.
Tom

20

Kullanıcı Tanımlı İşlev, bir sql server programcısı tarafından kullanılabilen önemli bir araçtır. Satır içi gibi bir SQL deyiminde kullanabilirsiniz.

SELECT a, lookupValue(b), c FROM customers 

lookupValueUDF nerede olacak. Saklı bir yordamı kullanırken bu tür işlevsellik mümkün değildir. Aynı zamanda bir UDF içinde belirli şeyler yapamazsınız. Burada hatırlanması gereken temel şey UDF'lerin:

  • kalıcı değişiklikler yaratamaz
  • veri değiştirilemiyor

saklı bir yordam bu şeyleri yapabilir.

Benim için UDF'nin satır içi kullanımı UDF'nin en önemli kullanımıdır.


14

Saklı Yordamlar komut dosyası olarak kullanılır . Sizin için bir dizi komut çalıştırırlar ve bunları belirli zamanlarda çalışacak şekilde programlayabilirsiniz. Genellikle INSERT, UPDATE, DELETE, vs. hatta SELECT gibi çoklu DML ifadelerini çalıştırır.

Fonksiyonlar yöntem olarak kullanılır. Bir şey iletiyorsunuz ve sonuç veriyor. Küçük ve hızlı olmalı - anında yapar. Genellikle bir SELECT deyiminde kullanılır.


2
Bu, onları düşünmenin iki, hızlı ve kirli yolunun iyi bir özetidir.
Eric Bishard

2
Gerçekten iyi bir özet. Diğer cevaplar, ikisinin teorik farkına odaklanırken, yine de pratikte hangisini kullanacağımdan emin değilim.
jf328

8

Saklı yordam:

  • SQL Server'da minyatür bir program gibidir.
  • Bir select deyimi kadar basit veya bir veritabanındaki birden çok tablodan veri ekleyen, silen, güncelleyen ve / veya okuyan uzun bir komut dosyası kadar karmaşık olabilir.
  • (Her ikisi de daha küçük sonuçlarla veya veriler üzerinde satır satır işlemlerle çalışmanıza izin veren döngüler ve imleçler uygulayabilir.)
  • EXECVeya kullanılarak çağrılmalıdır.EXECUTE deyimi .
  • Tablo değişkenlerini döndürür, ancak kullanamayız OUT parametreyi .
  • İşlemleri destekler.

İşlev:

  • Veritabanını güncellemek, silmek veya kayıt eklemek için kullanılamaz.
  • Tek bir değeri veya tablo değerini döndürmeniz yeterlidir.
  • Yalnızca kayıtları seçmek için kullanılabilir. Bununla birlikte, standart SQL içinden çok kolay bir şekilde çağrılabilir, örneğin:

    SELECT dbo.functionname('Parameter1')

    veya

    SELECT Name, dbo.Functionname('Parameter1') FROM sysObjects
  • Yeniden kullanılabilir basit seçim işlemleri için işlevler kodu basitleştirebilir. JOINİşlevlerinizde yan tümceleri kullanmaya dikkat edin. İşlevinizin bir JOINyan tümcesi varsa ve bunu birden çok sonuç döndüren başka bir select deyiminden çağırırsanız, bu işlev çağrısı sonuç kümesinde döndürülen her satır JOIN için bu tabloları birlikte kullanır . Bu nedenle, bazı mantığı basitleştirmede yardımcı olabilirler, ancak uygun şekilde kullanılmazlarsa performans darboğazı da olabilirler.

  • İle değerleri döndürür OUTParametre .
  • İşlemleri desteklemez.

8

Kullanıcı Tanımlı İşlev.

  1. İşlev bir değer döndürmelidir.
  2. Yalnızca Select deyimlerine izin verir, DML deyimlerini kullanmamıza izin vermez.
  3. Yalnızca giriş parametrelerine izin verir, çıkış parametrelerini desteklemez.
  4. Try-catch blokları kullanmamıza izin vermeyecektir.
  5. İşlevler dahilinde işlemlere izin verilmez.
  6. Yalnızca tablo değişkenlerini kullanabiliriz, geçici tabloların kullanılmasına izin vermez.
  7. Saklı Yordamlar bir işlevden çağrılamaz.
  8. İşlevler bir select deyiminden çağrılabilir.
  9. Bir UDF birleştirme yan tümcesinde sonuç kümesi olarak kullanılabilir.

Saklı yordam

  1. Saklı Yordam değerleri döndürebilir veya döndürmeyebilir.
  2. Seçme deyimlerinin yanı sıra ekleme, güncelleme, silme vb. DML deyimleri olabilir
  3. Hem giriş hem de çıkış parametrelerine sahip olabilir.
  4. İstisna yönetimi için try catch bloklarını kullanabiliriz.
  5. Saklı Yordamlar içindeki işlemleri kullanabilir.
  6. Hem tablo değişkenlerini hem de geçici tabloyu kullanabilir.
  7. Saklı Yordamlar işlevleri çağırabilir.
  8. Prosedürler Select / Where / Have vb. İfadelerden çağrılamaz. Execute / Exec deyimi Saklı Yordamı çağırmak / yürütmek için kullanılabilir.
  9. Birleştirme yan tümcesinde yordamlar kullanılamaz

6

Aşağıdaki noktaların ne zaman kullanacağına karar vermek için-

  1. Saklı yordamlar, işlev bunu yapabileceği şekilde bir tablo değişkeni döndüremez.

  2. Saklı yordamları kullanarak sunucu ortam parametrelerini değiştirebilirsiniz.

şerefe


6

İmleçler gibi SQL Server işlevleri son silahınız olarak kullanılmak içindir! Performans sorunları var ve bu nedenle tablo değerli bir işlev kullanmaktan mümkün olduğunca kaçınılmalıdır. Performanstan bahsetmek, bir orta sınıf donanımda bir sunucuda 1.000.000'dan fazla kaydı bulunan bir tablodan bahsediyor; Aksi takdirde, işlevlerin neden olduğu performans isabeti hakkında endişelenmenize gerek yoktur.

  1. Sonuç kümesini harici bir koda (ADO.Net gibi) döndürmek için asla bir işlev kullanmayın
  2. Görünümleri / kayıtlı proks kombinasyonunu mümkün olduğunca kullanın. DTA'nın (Veritabanı Ayarlama Danışmanı) size (dizinlenmiş görünümler ve istatistikler gibi) vereceği önerileri kullanarak gelecekteki büyüme performansı sorunlarından kurtulabilirsiniz - bazen!

daha fazla referans için bakınız: http://databases.aspfaq.com/database/should-i-use-a-view-a-stored-procedure-or-a-user-defined-function.html


1
Teşekkürler. Bugün bir sütun için değerleri doldurmak üzere bir sorgu içinde çağrılacak bir işlev yazdı. Ben durmadan önce Execute 3 dakikadan fazla çalıştı. Bunu yapmak için bir ORTAK yol buldum. Yürütme 15 saniye içinde tamamlandı. (Veri kümesi 3456 satırdı). Büyük performans farkı.
VISQL

edit: I "SİPARİŞ BY" sütununa bağlı olarak 15 ve 50 saniye arasında bitirir yürütme (Veri kümesi 3456 satır idi). Büyük performans farkı.
VISQL

Performans farkı, sonucu sipariş ettiğiniz sütunların farklı türlerinde köklere sahip olabilir. SQL Server, sayılarla karakter verisinden çok daha iyi çalışır. Bu 50 saniyelik sorguda DTA'yı kullanabilir ve sorgunun biraz daha hızlı çalışmasını sağlamak için bir tür istatistik / dizin önerisi bulup bulamayacağını görebilirsiniz.
Aşil

1
Son çare olması gerektiğini söylemek için yeterli kanıt sağlandığından emin değilim. Bir işlevi, üzerinde daha fazla işlem yapılabilen parametreli bir görünüm olarak düşünebilirsiniz. Örneğin, müşterilere siparişlere katılmak istiyorsunuz, ancak sadece michigan için. Yalnızca tek bir devletin müşteri değerine katılacak bir customerOrders (@StateCode) işlevi oluşturursunuz. Daha sonra, bu kümede FirstName, LastName, OrderTotal, StoreName olarak CustomerOrders ('MI') INNER JOIN Stores on Stores.StoreID = Orders.StoreID WHERE OrderTotal> 100; Geçici kopya olması gerektiği için bu SP'ler için bir acı olacaktır.
MPavlak

Bu tabloda kaç kayıt var? Donanımınız düzgün bir şekilde işliyorsa, silah seçimi konusunda endişelenmenize gerek yoktur. Bir kaşık, kılıcı kıracak kadar zor olduğunda işi yapabilir; bu sertliğe DONANIM denir!
Aşil

3

Tek bir değer döndüren işlevlerle başlayın. Güzel bir şey, sık kullanılan kodu bir işleve koyabilir ve sonuç kümesinde sütun olarak döndürebilirsiniz.

Ardından, parametrelenmiş şehirler listesi için bir işlev kullanabilirsiniz. dbo.GetCitiesIn ("NY") Birleştirme olarak kullanılabilecek bir tablo döndürür.

Kod düzenlemenin bir yolu. Bir şeyin ne zaman yeniden kullanılabilir ve zaman kaybı olduğunu bilmek, yalnızca deneme yanılma ve deneyim yoluyla kazanılan bir şeydir.

Ayrıca, işlevler SQL Server'da iyi bir fikirdir. Daha hızlıdırlar ve oldukça güçlü olabilirler. Satır içi ve doğrudan seçimler. Aşırı kullanmamaya dikkat edin.


3

Saklı yordamlar yerine işlevleri tercih etmek için pratik bir neden. Başka bir saklı yordamın sonuçlarını gerektiren bir saklı yordam varsa, bir insert-exec deyimi kullanmanız gerekir. Bu, geçici bir tablo oluşturmanız ve birexec ve saklı yordamın sonuçlarını eklemek için ifade . Dağınık. Bununla ilgili bir sorun, insert-exec'lerin yuvalanamamasıdır .

Diğer saklı yordamları çağıran saklı yordamlara takılı kalırsanız, bununla karşılaşabilirsiniz. İç içe saklı yordam yalnızca bir veri kümesi döndürürse, tablo değerli bir işlevle değiştirilebilir ve artık bu hatayı almayacaksınız.

( iş mantığını veritabanının dışında tutmamızın bir başka nedeni de budur )


2
  • Saklı yordam için değilken işlevin bir değer döndürmesi zorunludur.
  • Yalnızca UDF'de kabul edilen ifadeleri seçin, ancak DML ifadeleri gerekli değildir.
  • Saklı yordam, DML ifadelerinin yanı sıra tüm ifadeleri kabul eder.
  • UDF yalnızca girişlere izin verir, çıkışlara izin vermez.
  • Saklı yordam hem girdi hem de çıktı sağlar.
  • Yakalama blokları UDF'de kullanılamaz, ancak saklı yordamda kullanılabilir.
  • UDF'deki işlevlerde hiçbir işleme izin verilmez, ancak saklı yordamda bunlara izin verilir.
  • Yalnızca tablo değişkenleri UDF'de kullanılabilir, geçici tablolar kullanılamaz.
  • Saklı yordam hem tablo değişkenlerine hem de geçici tablolara izin verir.
  • UDF, saklı yordamların işlevlerden çağrılmasına izin vermezken, saklı yordamlar işlevlerin çağrılmasına izin verir.
  • Saklı yordamlar birleştirme yan tümcesinde kullanılamazken UDF birleştirme yan tümcesinde kullanılır.
  • Saklı yordam her zaman sıfıra dönmeye izin verecektir. Aksine UDF, önceden belirlenmiş bir noktaya geri dönmesi gereken değerlere sahiptir.

1
  • İşlevler, yordamların yapılamadığı bir select deyiminde kullanılabilir.

  • Saklı yordam hem giriş hem de çıkış parametrelerini alır, ancak İşlevler yalnızca giriş parametrelerini alır.

  • İşlevler, yordamlar olabildiğince metin, ntext, görüntü ve zaman damgaları değerlerini döndüremez.

  • İşlevler, oluşturma tablosunda kullanıcı tanımlı veri türleri olarak kullanılabilir, ancak yordamlar kullanılamaz.

*** Örnek: -oluştur table <tablename>(name varchar(10),salary getsal(name))

Burada getsal, maaş türünü döndüren kullanıcı tanımlı bir işlevdir, tablo oluşturulduğunda maaş türü için hiçbir depolama alanı ayrılmaz ve getsal işlevi de yürütülmez, Ancak bu tablodan bazı değerleri alırken, getsal işlevi çalıştırılır ve return Tip sonuç kümesi olarak döndürülür.


1

Bunun çok eski bir soru olduğunun farkındayım, ancak cevapların hiçbirinde bahsedilen önemli bir yönü görmüyorum: sorgu planına satır içi.

Fonksiyonlar olabilir ...

  1. skaler:

    CREATE FUNCTION ... RETURNS scalar_type AS BEGIN ... END

  2. Çok ifadeli tablo değerli:

    CREATE FUNCTION ... RETURNS @r TABLE(...) AS BEGIN ... END

  3. Satır içi tablo değerli:

    CREATE FUNCTION ... RETURNS TABLE AS RETURN SELECT ...

Üçüncü tür (satır içi tablo değerli), sorgu optimize edici tarafından temel olarak (parametreli) görünümler olarak ele alınır; bu, işlevin sorgunuzdan referans alması, işlevin SQL gövdesini kopyalamaya (aslında kopya yapıştırmadan) benzer, aşağıdaki avantajlara göre:

  • Sorgu planlayıcısı, satır içi işlevinin yürütülmesini diğer alt sorgularda olduğu gibi optimize edebilir (örneğin, kullanılmayan sütunları ortadan kaldırın, tahminleri aşağı itin, farklı JOIN stratejileri seçin vb.).
  • Birkaç satır içi işlevin birleştirilmesi, birinciden diğerine beslenmeden önce sonucun gerçekleştirilmesini gerektirmez.

Yukarıdakiler, özellikle birden fazla işlev seviyesini birleştirirken potansiyel olarak önemli performans tasarruflarına yol açabilir.


NOT: Görünüşe göre SQL Server 2019, bir çeşit skaler fonksiyonun satır içi özelliğini de tanıtacaktır .


-2

SQL Server'da, işlevler ve saklı yordam iki farklı tür varlıktır.

İşlev: SQL Server veritabanında, işlevler bazı eylemleri gerçekleştirmek için kullanılır ve eylem hemen bir sonuç döndürür. İşlevler iki türdür:

  1. Sistem tanımlı

  2. Kullanıcı tanımlı

Saklı Yordamlar: SQL Server'da saklı yordamlar sunucuda depolanır ve sıfır, tek ve birden çok değer döndürülebilir. Saklı Yordamlar iki türdür:

  1. Sistem Saklı Yordamları
  2. Kullanıcı Tanımlı Prosedürler
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.