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