Bu kodda ne yanlış var? – 1
Database’de şu scripti çalıştıralım;
CREATE TABLE T_PERSONEL
(
ADSOYAD VARCHAR(50),
DOGUM_TARIHI SMALLDATETIME
)
INSERT INTO T_PERSONEL VALUES ('Engin POLAT', '1981-01-12')
INSERT INTO T_PERSONEL VALUES ('Emre ERKAN', '1979-03-14')
INSERT INTO T_PERSONEL VALUES ('Ozan ÇAĞLARGİL', '1982-09-27')
INSERT INTO T_PERSONEL VALUES ('Fatih DURGUT', '1978-06-23')
INSERT INTO T_PERSONEL VALUES ('Burhan İNEGÖL', '1980-11-08')
Aşağıdaki stored procedure’i yazalım.
CREATE PROCEDURE PR_PERSONEL_LISTE
(
@SIRALAMA INT
)
AS
BEGIN
SELECT ADSOYAD, DOGUM_TARIHI FROM T_PERSONEL
ORDER BY
CASE @SIRALAMA
WHEN 1 THEN DOGUM_TARIHI
WHEN 2 THEN ADSOYAD
END
END
Bu procedure’ü 1 parametresi vererek çalıştırıyoruz, ve beklediğimiz sonucu alamıyoruz.
Nerede hata yaptık? (İpucu; parametre olarak 2 vermeyi deneyin)
Yorumlarınızı bekliyorum…
İlgili diğer başlıklar:
- @@IDENTITY, SCOPE_IDENTITY() ve IDENT_CURRENT() arasındaki farklar
- Sql Server 2008′de Çoklu Insert İşlemi
- Bu kodda ne yanlış var? – 2
- Sql Server 2008 Except ve Intersect Anahtar Kelimeleri
- Bu kodda ne yanlış var? – 9
- Sql Server’da Hash işlemi
- Bu kodda ne yanlış var? – 6
- Bu kodda ne yanlış var? – 4
- Bu kodda ne yanlış var? – 8
- Bu kodda ne yanlış var? – 5
Tabloda DOGUM_TARIHI VARCHAR(50) yaparsak sorun çözülüyor hocam.
Sevil Hanım, bence DOGUM_TARIHI alanının data tipini VARCHAR yapmak çok doğru değil. Hem sıralamadaki problemi gidermez.
Ama doğru iz üzerindesiniz, biraz daha uğraşın bakalım.
Başka fikri olan var mı arkadaşlar?
Bu kadar kolay olamayacağı kesindi zaten:)) Dogum tarihini evet dogru varchar yapmak mantıklı değil (yaş hesaplamak istediğimizde işimiz zorlaşacak) ama çalıştı öyle yapınca:)) Smalldatetime data tipini stringe çaviremiyor diyor hata mesajında. Ben de çevirdim:)) Merak ettim şimdi Fatih Ersin nerdesiniz:))
kodu uzun yazmıssın, biraz kısalttım.
ORDER BY CASE @SIRALAMA WHEN 1 then 1
WHEN 2 THEN 2 end
Peki sorunun çözümü?
Problemi tanımladık, hatta iyileştirdik bile. :)
Sıra geldi çözüm’e. Çözüm önerisi olanlar?
CASE @SIRALAMA
WHEN 1 THEN CONVERT(nvarchar(20), DOGUM_TARIHI,120)
WHEN 2 THEN ADSOYAD
END
case içinde tip dönüşümü yapıyor smalldate varchar dan baskın çıktığı için alan smalldate olarak tanımlanıyor ve varchar alanı ise smalldate dönüşüm olmadığından hata veriyor.
case @SIRALAMA
WHEN 1 THEN 1
WHEN 2 THEN 2
çalışıyor görünsede aslında doğru sunucu vermediğini göreceksiniz.
dinamik sql sorgusu olusturulursa sorun çözülür.
DECLARE @SIRALAMA INT SET @SIRALAMA = 1 DECLARE @sql nvarchar(max) set @sql = 'SELECT * FROM T_PERSONEL ORDER BY '+ CASE @SIRALAMA WHEN 4 THEN 'ADSOYAD asc' WHEN 1 THEN 'DOGUM_TARIHI asc' END exec(@sql)şuanda bu işinizi görür. Arastırma yapacagım problemin neden kaynaklandıgına dair ancak datatype uyusmazlıgından dolayı böyle bir yönteme basvurdum. datetime ve nvarhcar arasında bir dönüşüm dogru olmaz sorting işlemi için. saglıklı bir çözüm bulursam tekrar buraya yazacagım.
buda sağlıklı çözümü : örnek hoşuma gitti teşekkürler
DECLARE @SIRALAMA INT set @SIRALAMA = 4 SELECT * FROM T_PERSONEL ORDER BY CASE @SIRALAMA WHEN 1 THEN ADSOYAD END ,CASE WHEN @SIRALAMA = 4 THEN DOGUM_TARIHI END