27 Ekim 2015 Salı

MSSQL Dinamik Sorgu (Dynamic Query) Kullanımı

Sanırım hepimiz yazılıma yeni başlarken kod içerisinde textler aracılığıyla veri tabanı sorguları yazıp kullanmışızdır. Yeni mezunların bir çoğunda gördüğüm eksikliklerden bir tanesi de bu sanırım. İşe başladıklarında veritabanı işlemleri sırasında hep commadtext kullanmaları. Tabi bunda okullarımızın da etkisi var. Neyse bu başka bir konu.

Veritabanı işlemlerinde entityframework öncesinde bizde bir çok kez storedprocedure yazmak zorunda kaldık. Bu küçük projelerde sorun oluşturmasa da büyük projelerde baş belası durumlara neden olabiliyor. Aynı prosedureler farklı isimlerde yazılabiliyor ya da bir sürü prosedure arasında kaybolup gidebiliyorsunuz.



Örnek vermek gerekirse; bir personel tablosundan bir prosedurede isim parametresi ile sorgu oluştururken başka bir prosedurede yaşı parametresi ile sorgu yazmanız gerekebiliyor. Bu da prosedure kalabalığına neden oluyor. Yok ben bu prosedureleri birleştiricem diyorsanız da bu sefer ifler elselerin içinde kayboluyorsunuz. Bu nedenle böyle sorgular için ben dynamic query kullanıyorum. Aslında bunun yazımın başında belirttiğim kodun içinde yazılan sorguya benzerliği çok fazla ama bu sefer bunu veri tabanında yazıyoruz. Sanırım biraz gevezelik ettim kusura bakmayın. Hemen örnek kodlara geçelim.

Benim bir personel tablom var. İçinde Personel bilgileri var ve ben bu bilgiler arasında sorgulama yapacağım. İlk olarak tablomuzu oluşturalım.

dynamic query

Sıra geldi tablomuza veri eklemeye.

dynamic query
Tablomuzu da doldurduktan sonra sıra geldi querymizi oluşturmaya.

dynamic query

Aslında yaptığımız tek şey textleri birleştirerek sorgumuzu oluşturmak ve exec metodu ile çalıştırmak. Bu sorgumuzu şimdi de procedure dönüştürelim. Asıl farkı orada göreceğiz.

create procedure GetirPersonel
(
@name varchar(20),
@surname varchar(20),
@age int,
@company varchar(20)
)
as
declare @sqlCommand nvarchar(100)
declare @whereCase nvarchar(100)
begin

 set @sqlCommand=N'select * from DenekTablo ';
 set @whereCase='where 1=1 ';
 if @name is not null
   begin
   set @whereCase=@whereCase+' And PersonelName='''+@name+'''';
   end

if @surname is not null
   begin
   set @whereCase=@whereCase+' And PersonelSurname='''+@surname+'''';
   end
  
  if @age is not null
   begin
   set @whereCase=@whereCase+' And Age='+CONVERT(varchar ,@age);
   end
  if @company is not null
   begin
   set @whereCase=@whereCase+' And Company='''+@company+'''';
   end
  
  set @sqlCommand=@sqlCommand+@whereCase;
  
  Exec sp_Executesql  @sqlCommand 

end;


Sql sorgumuzu bir string olarak yazdık. Where koşullarımızı ise gelen değer null değilse ekledik. Böylece if else lerden kurtulmuş olduk. İsterseniz kendiniz bu sorguyu if elselerle yazabilirsiniz ben o kadar sabırlı değilim şu anda :)

Gelen text değerleri için sorgumuzda ''' koyduğumuza dikkat etmişsinizdir. Normalde PersonelName='Burak' olacaktı ancak burada text içinde text yazdığımız için bu tırnakları bu şekilde koymalıyız.

Birde Age alanına dikkat etmemiz gerekiyor. Integer bir değer olduğu için text olarak birleştiremiyoruz ve o nedenle convert etmemiz gerekiyor. Bakalım sorgumuz çalışıyor mu?

dynamic query
Evet güzel güzel çalıştı. Peki bunu normal yazsaydık ne farkı olacaktı. İlk olarak dynamic query nin dezavantajı text olarak yazıp çalıştırdığınız için hatanın nerede olduğunu bulmanız çok zor.

Bu nedenle uyanıklık yapıp tablonun bir alanına sorgunuzu yazdırabilir ve oradan oluşan sorguyu görebilirsiniz. Birde dinamik oluştuğu için diğer sorgular gibi bir kere derlenip kalmıyor. Her seferinde tekrardan oluşturuluyor. Ama bence kod karmaşasının içinde kaybolmaktansa küçük de olsa performans kaybına değer. Sonuçta bu sorguları sadece siz değil iş yerindeki diğer arkadaşlarınızda kullanacak.

Açıkçası bu yazıyı yazmak biraz yorucu oldu. Umarım faydalı olur.


1 yorum: