SQL Serverda Dinamik Order by Kullanimi:
Bazen yazdigimiz TSQL scriplerde datalari dinamik olarak siralama ihtiyaci duyariz. Yeni farkli durumlarda farkli kolonlara göre siralama (order by) yapmamiz gerekir. Bunu çogunuz farkli siralama yapan dinamik sorgularla çözmeye çalisir, halbuki order by kisminda case ifadesi içinde farkli durumlara göre farkli siralama kolonlari seçebiliriz. Bir stored procedur olusturalim ve gönderecegimiz parametreye göre farkli kolonlara göre siralama yapalim. .
Örneklerde kullanacagimiz Musteri tablosu ve datalarini asagidaki sorgulari kendi makinanizda çalistirarak olusturabilirsiniz.
create table Musteri ( ID int, Ad varchar(30), Soyad varchar(30), DogumYili int ) insert into Musteri values (1,'ERDINÇ','ÖZBAKIR',1987) insert into Musteri values (2,'CAFER','YALÇIN',1990) insert into Musteri values (3,'CEMIL','DEMIRTAS',1977) insert into Musteri values (4,'ZEHRA','PARLAK',1981) insert into Musteri values (5,'NECDET','SABIR',1984) insert into Musteri values (6,'DURKAN','KELES',1987) insert into Musteri values (7,'HALIL','HAYDAR',1970) insert into Musteri values (8,'MURAT','ÇELIK',1971) insert into Musteri values (9,'SABRI','YAVUZ',1955) insert into Musteri values (10,'SUAT','BEZIRCIOGLU',1949)
Yukaridaki sorgulari çalistirip gerekli tabloyu olusturdunuz ve datalari tabloya insert ettiyseniz, sira store procedure olusturup istedigimiz scripti hazirlamaya.
CREATE PROC [dbo].[spDinamikSiraliMusteri] ( @DinamikKolonID INT ) AS BEGIN SELECT * FROM Musteri ORDER BY CASE WHEN @DinamikKolonID =1 THEN Ad else Soyad end END
Yukaridaki stored procudure çalistirilirken parametre olarak 1 verilrse Ada göre siralarken 1 disinda bir degerde Soyada göre siralama yapacaktir. Simdi gelelim veri tipleri farkli kolonlari kullanmaya. Yukaridaki sorguda order kismini asagidaki gibi degistirin.
ORDER BY CASE WHEN @DinamikKolonID =1 THEN ID WHEN @DinamikKolonID =2 THEN Ad WHEN @DinamikKolonID =3 THEN Soyad else DogumYili end
Stored Procedure u yeniden olusturup 1, 2 ve 3 parametresi ile ayri ayri çalistirin. 2 ve 3 degerleri çalistirdiginiz zaman Conversion failed when converting the nvarchar value ‘Mr.’ to data type int hatasi alacaksiniz. Bunu sebebi order için yazdigimiz case içinde hem int hemde varchar kolonlari kullanmamizdir. Farkli tiplerde kolon kullanacaksak tüm kolonlari cast islemine tabi tutarak yukaridaki hatayi düzeltebiliriz. Yeni sorgumuz asagidaki gibi olamali
.CREATE PROC [dbo].[spDinamikSiraliMusteri] ( @DinamikKolonID INT ) AS BEGIN SELECT * FROM Musteri ORDER BY CASE WHEN @DinamikKolonID =1 THEN cast(ID as varchar) WHEN @DinamikKolonID =2 THEN cast(Ad as varchar) WHEN @DinamikKolonID =3 THEN cast(Soyad as varchar) else cast(Dogumyili as varchar) end END
Procedure’u asagidaki gibi çagirabilirsiniz.
exec [dbo].[spDinamikSiraliMusteri] 1 exec [dbo].[spDinamikSiraliMusteri] 2 exec [dbo].[spDinamikSiraliMusteri] 3 exec [dbo].[spDinamikSiraliMusteri].
Gayet faydali ve verimli bir bilgi, çok tesekkürler.