•  Stored Procedureler, bir takım alt yordamların bir araya gelmesiyle oluşturulmuş veritabanı nesneleri olarak düşünülebilir.
  • Stored Procedure’ler, sahip oldukları cache mekanizması sayesinde sorguların çalışma sürelerini kısaltabilirler.
  •  Stored Procedure’ler, çalıştırdıkları sorgulara ait execution planı saklarlar. Bu plan daha sonra kullanılmak üzere Stored Procedure Cache’e atılır.
  •  Dolayısıyla aynı prosedürü tekrar çalıştırdığımızda, ilk çalışmada meydana gelen ve vakit kaybına sebep olan bir işler tekrar yapılmamış olur.
  • Özellikle büyük tablolarda, yapılan rapolarda, hangi indexlerin kullanılması gerektiğiyle ilgili çıkartılan execution plan vakit kaybettirir. Bu planın cache’ten kullanılması performansı çok ciddi bir şekilde arttırabilir.

 Örnek Olarak Basit Bir prosedür Tanımlayalım;

Use AdventureWorks2017

CREATE PROC Person.UlkeListesi --Buradaki "Person" Şema adıdır. 
AS
SELECT * FROM Person.CountryRegion

exec Person.UlkeListesi 
Prosedürler SELECT edilemezler! Sadece EXEC edilebilirler.
Procedurümüzü Çalıştıralım;
exec Person.UlkeListesi

Parametrik Stored Procedure

Bir SP parametrik yapılabilir. Output parametreler yapılabilir.

Öncelikle Çalışacağımız Tabloları Oluşturalım;
1-Urun Tablosu
2-Satis Tablosu

 CREATE TABLE Urun
(
    UrunID INT IDENTITY(1,1),
    Ad NVARCHAR(50),
    Fiyat MONEY,
    Stok INT
)

CREATE TABLE Satis

(
SatisID INT IDENTITY(1,1),
UrunID INT,
SatisFiyat MONEY,
Adet INT,
Tarih SMALLDATETIME

 )

Tablolarımızı Oluşturduk ,  Biraz Veri Ekleyelim.

insert into Urun(Ad,Fiyat,Stok) values('ACE','2','2')

 insert into Urun(Ad,Fiyat,Stok) values('OMO','4','1')

insert into Urun(Ad,Fiyat,Stok) values('Pril','5','5')

Şimdi yapacağımız prosedürün senaryosunu yazalım.

      1-      SatisYap isimli bir prosedür yazalım
     2-      Parametre olarak satılan ürünün id’sini ve adedini alsın.
      3-      Satis tablosuna yapılan satışı insert etsin.
      4-      Urun tablosunda satılan ürünün stok miktarını update etsin.

Prosedürümüzü Yazmaya Başlayalım.

create PROC SatisYap(@UrunID INT,@Adet INT)

AS

BEGIN

      DECLARE @Fiyat MONEY,@Stok INT
      SELECT @Fiyat = Fiyat,@Stok = Stok FROM Urun WHERE UrunID=@UrunID

      IF(@Stok >= @Adet)
      BEGIN

            INSERT INTO Satis VALUES(@UrunID,@Fiyat,@Adet,GETDATE())

            UPDATE Urun SET Stok = Stok - @Adet WHERE UrunID=@UrunID

      END

      ELSE

            RAISERROR('Ürünün stok miktari yetersiz.',9,1)

END

Çalıştıralım Şimdi Prosedürümüzü

BEGIN TRY

      EXEC SatisYap1,5

END TRY

BEGIN CATCH

      PRINT 'Hata meydana gelmiş'

END CATCH
Prosedürümüzü çalıştırdığımızda; 
Ürünün stok miktari yetersiz.
 Msg 50000, Level 9, State 1 

hatasını almış olmamız gerekiyor. Çünkü 1 Nolu üründen 5 adet stok bulunmamaktadır. 
eğer parametreleri 
EXEC SatisYap 1,1 olarak çalıştırdımızda gerekli işlemin başarı olarak sonuçlandığını görüyor olacağız.

Görüşmek üzere..