Ö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ç)
İ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ç)
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ç)
Ü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ç)
Ş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_IDINNER JOIN (Sonuç)
Ş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 @strSorguINNER JOIN Dinamik (Sonuç)
Ö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 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ç)