SQL Server'da Dinamik Sorgu Yazmak

SQL üzerinde birden fazla değişkenin durumuna göre sorguya dahil edilmesini anlatacağız.

Öncelikle bu örneği basit bir üyelik sistemi üzerinde anlatmayı düşünüyorum. Diyelim ki yaptığınız bir sistemde üyeleriniz bulunuyor ve bunları detaylı bir şekilde listelemek istiyorsunuz.
Örnek verecek olursak
- "Çankaya ilçesindeki Ahmed isimli kişiler"
- "İstanbul ilindeki 1990 doğumlu kişiler"
- "Adana'daki erkek üyeler"
şeklinde uzayıp giden farklı varyasyonlara sahip bir arama yapmak isterseniz bu durumda SQL Server'da sp_Executesql yordamını kullanmanız gerekecektir.
Tablolarımızı oluşturmakla başlayalım.
İller Tablosu (SQL)
CREATE TABLE tblIller
(
il_ID INT NOT NULL IDENTITY(1,1),
il_adi VARCHAR(255)
)

INSERT INTO tblIller (il_adi) VALUES ('Adana')
INSERT INTO tblIller (il_adi) VALUES ('Adıyaman')
INSERT INTO tblIller (il_adi) VALUES ('Afyon')
INSERT INTO tblIller (il_adi) VALUES ('Ağrı')
İller Tablosu (Sonuç)
İller Tablosu

İlçeler Tablosu (SQL)
CREATE TABLE tblIlceler
(
ilce_ID INT NOT NULL IDENTITY(1,1),
il_ID INT,
ilce_adi VARCHAR(255)
)

INSERT INTO tblIlceler (il_ID, ilce_adi) VALUES (1, 'Adana İlçe 1')
INSERT INTO tblIlceler (il_ID, ilce_adi) VALUES (1, 'Adana İlçe 2')
INSERT INTO tblIlceler (il_ID, ilce_adi) VALUES (1, 'Adana İlçe 3')
INSERT INTO tblIlceler (il_ID, ilce_adi) VALUES (1, 'Adana İlçe 4')
INSERT INTO tblIlceler (il_ID, ilce_adi) VALUES (1, 'Adana İlçe 5')
INSERT INTO tblIlceler (il_ID, ilce_adi) VALUES (2, 'Adıyaman İlçe 1')
INSERT INTO tblIlceler (il_ID, ilce_adi) VALUES (3, 'Afyon İlçe 1')
INSERT INTO tblIlceler (il_ID, ilce_adi) VALUES (3, 'Afyon İlçe 2')
INSERT INTO tblIlceler (il_ID, ilce_adi) VALUES (3, 'Afyon İlçe 3')
INSERT INTO tblIlceler (il_ID, ilce_adi) VALUES (3, 'Afyon İlçe 4')
INSERT INTO tblIlceler (il_ID, ilce_adi) VALUES (4, 'Ağrı İlçe 1')
İlçeler Tablosu (Sonuç)
İlçeler Tablosu

Mahalleler Tablosu
CREATE TABLE tblMahalleler
(
mahalle_ID INT NOT NULL IDENTITY(1,1),
ilce_ID INT,
mahalle_adi VARCHAR(255)
)

INSERT INTO tblMahalleler (ilce_ID, mahalle_adi) VALUES (1, 'Adana İlçe 1 Mahalle 1')
INSERT INTO tblMahalleler (ilce_ID, mahalle_adi) VALUES (1, 'Adana İlçe 1 Mahalle 2')
INSERT INTO tblMahalleler (ilce_ID, mahalle_adi) VALUES (9, 'Afyon İlçe 3 Mahalle 1')
INSERT INTO tblMahalleler (ilce_ID, mahalle_adi) VALUES (9, 'Afyon İlçe 3 Mahalle 2')
INSERT INTO tblMahalleler (ilce_ID, mahalle_adi) VALUES (6, 'Adıyaman İlçe 1 Mahalle 1')
INSERT INTO tblMahalleler (ilce_ID, mahalle_adi) VALUES (11, 'Ağrı İlçe 1 Mahalle 1')
Mahalleler Tablosu (Sonuç)
Mahalleler Tablosu

Üyeler Tablosu (SQL)
CREATE TABLE tblUyeler
(
uye_ID INT NOT NULL IDENTITY(1,1),
il_ID INT,
ilce_ID INT,
mahalle_ID INT,
ad VARCHAR(50),
soyad VARCHAR(50),
dogum_tarihi DATE,
cinsiyet BIT
)

INSERT INTO tblUyeler
(il_ID, ilce_ID, mahalle_ID, ad, soyad, dogum_tarihi, cinsiyet)
VALUES
(3, 9, 4, 'Ahmed', 'İhsan', '2016-04-01', 1)

INSERT INTO tblUyeler
(il_ID, ilce_ID, mahalle_ID, ad, soyad, dogum_tarihi, cinsiyet)
VALUES
(2, 6, 5, 'Asmin', 'Nisa', '2015-03-02', 0)

INSERT INTO tblUyeler
(il_ID, ilce_ID, mahalle_ID, ad, soyad, dogum_tarihi, cinsiyet)
VALUES
(1, 2, 2, 'Yusuf', 'Taha', '2013-01-01', 1)

INSERT INTO tblUyeler
(il_ID, ilce_ID, mahalle_ID, ad, soyad, dogum_tarihi, cinsiyet)
VALUES
(1, 2, 2, 'Mehmet', 'Fıstık', '2010-11-01', 1)

INSERT INTO tblUyeler
(il_ID, ilce_ID, mahalle_ID, ad, soyad, dogum_tarihi, cinsiyet)
VALUES
(4, 11, 6, 'Gülsima', 'Ulaş', '2005-08-09', 0)
Üyeler Tablosu (Sonuç)
Üyeler Tablosu


Şimdi ise dinamik olarak sorgu yazmaya başlayalım. Dinamik sorgunun mantığı şu şekildedir: Hangi paramaetre dolu gelmişse o sorguya dahil olur ve kriterlerimize uygun olarak istenilen sonuçları elde etmiş oluruz.
Klasik olarak INNER JOIN sorgusu ile il, ilçe, mahalle, üye kayıtlarının tümünü ekrana dökelim.
INNER JOIN ile Tüm Kayıtlar (SQL)
SELECT 
A.il_adi, B.ilce_adi, C.mahalle_adi, D.ad, D.soyad, D.dogum_tarihi, D.cinsiyet 
FROM tblIller AS A
INNER JOIN tblIlceler AS B ON A.il_ID = B.il_ID
INNER JOIN tblMahalleler AS C ON B.ilce_ID = C.ilce_ID
INNER JOIN tblUyeler AS D ON C.mahalle_ID = D.mahalle_ID
INNER JOIN (Sonuç)
INNER JOIN

Şimdi bu JOIN sorgusunu dinamik şekilde yazmaya çalışalım.
INNER JOIN Dinamik (SQL)
DECLARE @strAd VARCHAR(50)
DECLARE @strSoyad VARCHAR(50)
DECLARE @intIl_ID INT
DECLARE @intIlce_ID INT
DECLARE @intMahalle_ID INT
DECLARE @dtmDogum_Tarihi DATE
DECLARE @bitCinsiyet BIT

DECLARE @strSorgu AS NVARCHAR(4000)
SET @strSorgu = 'SELECT A.il_adi, B.ilce_adi, C.mahalle_adi, D.ad, D.soyad, D.dogum_tarihi, D.cinsiyet FROM tblIller AS A INNER JOIN tblIlceler AS B ON A.il_ID = B.il_ID INNER JOIN tblMahalleler AS C ON B.ilce_ID = C.ilce_ID INNER JOIN tblUyeler AS D ON C.mahalle_ID = D.mahalle_ID WHERE 1=1'

Execute sp_Executesql @strSorgu
INNER JOIN Dinamik (Sonuç)
INNER JOIN Dinamik

Örnek 1: Adana ilinde doğanları listeleyelim.
Örnek 1 (SQL)
DECLARE @strAd VARCHAR(50)
DECLARE @strSoyad VARCHAR(50)
DECLARE @intIl_ID INT = 1
DECLARE @intIlce_ID INT
DECLARE @intMahalle_ID INT
DECLARE @dtmDogum_Tarihi DATE
DECLARE @bitCinsiyet BIT

DECLARE @strParametreler AS NVARCHAR(4000)
DECLARE @strSorgu AS NVARCHAR(4000)
SET @strSorgu = 'SELECT A.il_adi, B.ilce_adi, C.mahalle_adi, D.ad, D.soyad, D.dogum_tarihi, D.cinsiyet FROM tblIller AS A INNER JOIN tblIlceler AS B ON A.il_ID = B.il_ID INNER JOIN tblMahalleler AS C ON B.ilce_ID = C.ilce_ID INNER JOIN tblUyeler AS D ON C.mahalle_ID = D.mahalle_ID WHERE 1=1'

IF (@intIl_ID IS NOT NULL)
	SET @strSorgu = @strSorgu + ' AND (A.il_ID = @intIl_ID)'

SET @strParametreler = '@intIl_ID INT'

EXECUTE sp_Executesql @strSorgu, @strParametreler, @intIl_ID
Örnek 1 (Sonuç)
Örnek 1

Örnek 2: Adana ilinde ve 2011 yılı sonrası doğanları listeleyelim.
Örnek 2 (SQL)
DECLARE @strAd VARCHAR(50)
DECLARE @strSoyad VARCHAR(50)
DECLARE @intIl_ID INT = 1
DECLARE @intIlce_ID INT
DECLARE @intMahalle_ID INT
DECLARE @dtmDogum_Tarihi DATE = '2011-01-01'
DECLARE @bitCinsiyet BIT

DECLARE @strParametreler AS NVARCHAR(4000)
DECLARE @strSorgu AS NVARCHAR(4000)
SET @strSorgu = 'SELECT A.il_adi, B.ilce_adi, C.mahalle_adi, D.ad, D.soyad, D.dogum_tarihi, D.cinsiyet FROM tblIller AS A INNER JOIN tblIlceler AS B ON A.il_ID = B.il_ID INNER JOIN tblMahalleler AS C ON B.ilce_ID = C.ilce_ID INNER JOIN tblUyeler AS D ON C.mahalle_ID = D.mahalle_ID WHERE 1=1'

IF (@intIl_ID IS NOT NULL)
	SET @strSorgu = @strSorgu + ' AND (A.il_ID = @intIl_ID)'

IF (@dtmDogum_Tarihi IS NOT NULL)
	SET @strSorgu = @strSorgu + ' AND (D.dogum_tarihi > @dtmDogum_Tarihi)'

SET @strParametreler = '@intIl_ID INT, @dtmDogum_Tarihi DATE'

EXECUTE sp_Executesql @strSorgu, @strParametreler, @intIl_ID, @dtmDogum_Tarihi
Örnek 2 (Sonuç)
Örnek 2

Yorumlar

  • adsız

    adsız:

    1 ay önce

    Elerinize sağlık.
    0 cevapla
  • Yönetici Yorumu:

    1 ay önce

    İlginize teşekkürler.

Yorum Yaz

Avatar

REKLAM

DDos Koruma, Botnet Koruma, Layer 7 Saldırı koruması, Sanal sunucu, Vds sunucu

REKLAM

Çizgi Filmler

EN

  • Popüler
  • Yeni
  • Son Yorum