İş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?
İş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?
Yanıtlar:
Fonksiyonlar hesaplanan değerlerdir ve üzerinde kalıcı çevresel değişiklikler yapamazlar SQL Server
(yani, hayır INSERT
veya UPDATE
ifadelere izin verilmez).
Bir işlev, SQL
bir 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 SQL
yerine 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
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. | |
+---------------------------------+----------------------------------------+
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 table
Veya 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).
SELECT * from dbo.MyTableValuedFunction()
. SPROCs Öte yanda ayarlayarak ADO.NET ile doğrudan çağrılabilir SqlCommand.CommandType
için CommandType.StoredProcedure
.
Saklı yordamlar ve kullanıcı tanımlı işlevler arasındaki farklar:
RAISEERROR
VEYA @@ERROR
UDF'lerde izin verilmez.GETDATE()
UDF'lerde kullanılamaz.GETDATE()
bir İşlevde kullanılabilir. Deterministik olmayan pivot iyi bir şey değildir.
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!
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.
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.
Returns
anahtar 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) Int
Deyim yoluyla 1 tip Sonuç Kodu Return
ve / veya b) Anahtar kelime ile 1+ Parametreler (tür dahil Cursor
) Output
ve / veya c) 1+ Select
Deyimler yoluyla Satır Setleri . döndürüldüğünde, "Ekleme" İfadesi "nin" execute_statement "bağımsız değişkeni olarak kullanılabilir.
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
lookupValue
UDF 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:
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.
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.
Saklı yordam:
EXEC
Veya kullanılarak çağrılmalıdır.EXECUTE
deyimi .OUT
parametreyi .İşlev:
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 JOIN
yan 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.
OUT
Parametre .Kullanıcı Tanımlı İşlev.
Saklı yordam
İ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.
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
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.
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 )
İş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.
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 ...
skaler:
CREATE FUNCTION ... RETURNS scalar_type AS BEGIN ... END
Çok ifadeli tablo değerli:
CREATE FUNCTION ... RETURNS @r TABLE(...) AS BEGIN ... END
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:
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 .
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:
Sistem tanımlı
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: