Ana Sayfa > Programlama, SQL > Bu kodda ne yanlış var? – 1

Bu kodda ne yanlış var? – 1

04 Ocak 2010

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:



  1. Sevil Çiçek
    Ocak 5th, 2010 at 12:28 | #1

    Tabloda DOGUM_TARIHI VARCHAR(50) yaparsak sorun çözülüyor hocam.

  2. Ocak 5th, 2010 at 13:33 | #2

    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?

  3. Sevil Çiçek
    Ocak 5th, 2010 at 16:02 | #3

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

  4. Saygın
    Ocak 7th, 2010 at 17:03 | #4

    kodu uzun yazmıssın, biraz kısalttım.

    ORDER BY CASE @SIRALAMA WHEN 1 then 1
    WHEN 2 THEN 2 end

  5. Ocak 7th, 2010 at 17:10 | #5

    Peki sorunun çözümü?

    Problemi tanımladık, hatta iyileştirdik bile. :)

    Sıra geldi çözüm’e. Çözüm önerisi olanlar?

  6. Murat Aras
    Şubat 16th, 2010 at 11:41 | #6

    CASE @SIRALAMA
    WHEN 1 THEN CONVERT(nvarchar(20), DOGUM_TARIHI,120)
    WHEN 2 THEN ADSOYAD
    END

  7. yavuz
    Mart 11th, 2010 at 13:05 | #7

    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.

  8. Kasım 15th, 2010 at 19:18 | #8

    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.

  9. Kasım 15th, 2010 at 19:35 | #9

    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