SQL Serverda Dinamik Order by Kullanimi

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] 
.

One thought on “SQL Serverda Dinamik Order by Kullanimi

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir