none
NVarchar - NText/Long NVarchar içindeki Verileri parser etmek RRS feed

  • Soru

  •  Merhaba Arkadaşlar,

    Şöyle bir tablo var.

    DersID OgrenciNo    Cevaplar
    55 999 ABCDACDBCA

    Öğrencinin cevabı olduğu kolonda 'ABCDACDBCA' her soruya verdiği cevaplar var.

    Bu cevap kolonunu parçalamam gerekiyor.Şöyle bir parçalamaya ihtiyacım var.

    Seçenek sirası var 1.Sira A - 2.Sira B -3.Sira C - 4.Sira D

    10 soruluk soruya öğrencinin verdiği cevaplar.'ABCD ACDBCA' (1.Soru-A,2.Soru-B,3.Soru-C,4.Soru-D)

    Aşağıdaki gibi bir tabloya dönüştürmem gerekiyor.

    Fikirlerinizi bekliyorum.

    SoruID OgrenciNo  Cevap Sira
    1 999 A 1
    2 999 B 2
    3 999 C 3
    4 999 D 4
    5 999 A 1
    6 999 C 3
    7 999 D 4
    8 999 B 2
    9 999 C 3
    10 999 A 1

    Öğrenmek,öğrenmek...

    4 Nisan 2012 Çarşamba 12:56

Yanıtlar

  • Merhaba,

    Once su function'i olusturun. Daha sonradan asagidaki code uzerinde calisarak istediginiz formata getirin.

    CREATE FUNCTION [dbo].[SPLIT] (
     @str_in VARCHAR(8000)
    )
    RETURNS @strtable TABLE (SoruID int identity(1,1), Cevap VARCHAR(8000))
    
    AS
    
    BEGIN
    
    DECLARE @tmpStr VARCHAR(8000), @tmpChr VARCHAR(5), @ind INT = 1, @nullcnt INT = 0
    SELECT @tmpStr = @str_in
    
    WHILE LEN(@tmpStr) >= @ind
    BEGIN
    
     SET @tmpChr = SUBSTRING(@tmpStr,@ind,1)
     IF ISNUMERIC(@tmpChr) = 0
      INSERT INTO @strtable SELECT @tmpChr
     ELSE
      WHILE @nullcnt < @tmpChr
      BEGIN
       INSERT INTO @strtable SELECT NULL
       SET @nullcnt = @nullcnt + 1
      END
     SELECT @ind = @ind + 1, @nullcnt = 0
    
    END
    
    RETURN
    
    END
    GO

    DECLARE @Tablo AS TABLE (DersID INT ,OgrenciNo INT ,Cevaplar VARCHAR(250))
    
    INSERT INTO @Tablo
      (
        DersID
       ,OgrenciNo
       ,Cevaplar
      )
    VALUES
      (
        55
       ,708
       ,'ABCDACDBCA'
      )
    INSERT INTO @Tablo
      (
        DersID
       ,OgrenciNo
       ,Cevaplar
      )
    VALUES
      (
        56
       ,256
       ,'CDEAACDBCA'
      )
    INSERT INTO @Tablo
      (
        DersID
       ,OgrenciNo
       ,Cevaplar
      )
    VALUES
      (
        55
       ,980
       ,'CAEDABCEDA'
      )
    INSERT INTO @Tablo
      (
        DersID
       ,OgrenciNo
       ,Cevaplar
      )
    VALUES
      (
        56
       ,879
       ,'BACDACBBCA'
      )
    INSERT INTO @Tablo
      (
        DersID
       ,OgrenciNo
       ,Cevaplar
      )
    VALUES
      (
        55
       ,991
       ,'DDDDACEDDA'
      )
    INSERT INTO @Tablo
      (
        DersID
       ,OgrenciNo
       ,Cevaplar
      )
    VALUES
      (
        55
       ,120
       ,'EECCDADBCA'
      )
    
    
    
    SELECT *
    FROM   @Tablo A
           CROSS APPLY dbo.SPLIT(A.Cevaplar) B

    Kolay gelsin.


    http://www.yigitaktan.com

    • Yanıt Olarak İşaretleyen geek-mind 5 Nisan 2012 Perşembe 15:10
    4 Nisan 2012 Çarşamba 14:05

Tüm Yanıtlar

  •  Merhaba Arkadaşlar,

    Şöyle bir tablo var.

    DersID OgrenciNo    Cevaplar
    55 999 ABCDACDBCA

    Öğrencinin cevabı olduğu kolonda 'ABCDACDBCA' her soruya verdiği cevaplar var.

    Bu cevap kolonunu parçalamam gerekiyor.Şöyle bir parçalamaya ihtiyacım var.

    Seçenek sirası var 1.Sira A - 2.Sira B -3.Sira C - 4.Sira D

    10 soruluk soruya öğrencinin verdiği cevaplar.'ABCD ACDBCA' (1.Soru-A,2.Soru-B,3.Soru-C,4.Soru-D)

    Aşağıdaki gibi bir tabloya dönüştürmem gerekiyor.

    Fikirlerinizi bekliyorum.

    SoruID OgrenciNo  Cevap Sira
    1 999 A 1
    2 999 B 2
    3 999 C 3
    4 999 D 4
    5 999 A 1
    6 999 C 3
    7 999 D 4
    8 999 B 2
    9 999 C 3
    10 999 A 1

    Öğrenmek,öğrenmek...

    • Birleştiren Serkan Bark 4 Nisan 2012 Çarşamba 13:04 aynı soru
    4 Nisan 2012 Çarşamba 12:57
  • -Konu Dışı-

    Merhaba Serdar,

    Aşağıda açık olarak bulunan 3 konu hakkında geri dönüş alabilir miyiz? Problemler çözüldü ise lütfen yanıt olarak işaretleyelim. Eğer kesin bir yanıt aramıyorsak yada uzun vadede işlem gerçekleştirecek isek konuları tartışma türüne çevirelim lütfen.

    Backup Log Dosyasını Boyutunu Düşürmek

    Birden Fazla Tabloyu Recursive Dönüştürmek
    INSERT INTO - Msg 2627 Hatası

    Forumlara gösterdiğin ilgiden dolayı teşekkür ederim.

    İyi Çalışmalar.


    Microsoft bu servisi kullanıcılarına yardım etme, Microsoft ürünleri ve teknolojileriyle ilgili bilgi bankasını genişletme amacıyla ücretsiz sunmaktadır.
    Bu içerik olduğu gibi benim tarafımdan hazırlanmış olup Microsoft tarafından herhangi gibi bir sorumluluk üstlenildiği anlamına gelmez.
    Facebook Üzerinden Takip Et!
    Twitter'da Takip Et!

    4 Nisan 2012 Çarşamba 13:08
  • Merhaba,

    Once su function'i olusturun. Daha sonradan asagidaki code uzerinde calisarak istediginiz formata getirin.

    CREATE FUNCTION [dbo].[SPLIT] (
     @str_in VARCHAR(8000)
    )
    RETURNS @strtable TABLE (SoruID int identity(1,1), Cevap VARCHAR(8000))
    
    AS
    
    BEGIN
    
    DECLARE @tmpStr VARCHAR(8000), @tmpChr VARCHAR(5), @ind INT = 1, @nullcnt INT = 0
    SELECT @tmpStr = @str_in
    
    WHILE LEN(@tmpStr) >= @ind
    BEGIN
    
     SET @tmpChr = SUBSTRING(@tmpStr,@ind,1)
     IF ISNUMERIC(@tmpChr) = 0
      INSERT INTO @strtable SELECT @tmpChr
     ELSE
      WHILE @nullcnt < @tmpChr
      BEGIN
       INSERT INTO @strtable SELECT NULL
       SET @nullcnt = @nullcnt + 1
      END
     SELECT @ind = @ind + 1, @nullcnt = 0
    
    END
    
    RETURN
    
    END
    GO

    DECLARE @Tablo AS TABLE (DersID INT ,OgrenciNo INT ,Cevaplar VARCHAR(250))
    
    INSERT INTO @Tablo
      (
        DersID
       ,OgrenciNo
       ,Cevaplar
      )
    VALUES
      (
        55
       ,708
       ,'ABCDACDBCA'
      )
    INSERT INTO @Tablo
      (
        DersID
       ,OgrenciNo
       ,Cevaplar
      )
    VALUES
      (
        56
       ,256
       ,'CDEAACDBCA'
      )
    INSERT INTO @Tablo
      (
        DersID
       ,OgrenciNo
       ,Cevaplar
      )
    VALUES
      (
        55
       ,980
       ,'CAEDABCEDA'
      )
    INSERT INTO @Tablo
      (
        DersID
       ,OgrenciNo
       ,Cevaplar
      )
    VALUES
      (
        56
       ,879
       ,'BACDACBBCA'
      )
    INSERT INTO @Tablo
      (
        DersID
       ,OgrenciNo
       ,Cevaplar
      )
    VALUES
      (
        55
       ,991
       ,'DDDDACEDDA'
      )
    INSERT INTO @Tablo
      (
        DersID
       ,OgrenciNo
       ,Cevaplar
      )
    VALUES
      (
        55
       ,120
       ,'EECCDADBCA'
      )
    
    
    
    SELECT *
    FROM   @Tablo A
           CROSS APPLY dbo.SPLIT(A.Cevaplar) B

    Kolay gelsin.


    http://www.yigitaktan.com

    • Yanıt Olarak İşaretleyen geek-mind 5 Nisan 2012 Perşembe 15:10
    4 Nisan 2012 Çarşamba 14:05
  • Kendi User Functionu yazmaya çalışyordum. :)

    Sql Server String Functionu yetmedi :)

    Teşekkürler.


    Öğrenmek,öğrenmek...

    4 Nisan 2012 Çarşamba 14:09
  • Yigit Bey,

    :) 2 farklı database de denedim.

    Birinde çalışıyor,diğerinde çalışmıyor.

    Function özelliklerinde mi acaba problem :)


    Öğrenmek,öğrenmek...

    4 Nisan 2012 Çarşamba 15:05
  • Merhaba,

    Function'i kullanirken diger DB'de de yarattiniz dimi? veya cagirirken diger DB'den Database ismini kullaniyormusunuz?

    Calismiyorsa yanlis modifiye etmissinizdir.

    Kolay gelsin.


    http://www.yigitaktan.com

    4 Nisan 2012 Çarşamba 15:11
  • Function oluşturmada sıkıntı yok.

    Aşağıdaki @Tablo yu kullandığımda hata veriyor.

    Birinde çalışıyor,diğerinde çalışmıyor. :)

    DECLARE @Tablo AS TABLE (DersID INT ,OgrenciNo INT ,Cevaplar VARCHAR(250))
    
    INSERT INTO @Tablo
      (
        DersID
       ,OgrenciNo
       ,Cevaplar
      )
    VALUES
      (
        55
       ,708
       ,'ABCDACDBCA'
      )
    INSERT INTO @Tablo
      (
        DersID
       ,OgrenciNo
       ,Cevaplar
      )
    VALUES
      (
        56
       ,256
       ,'CDEAACDBCA'
      )
    INSERT INTO @Tablo
      (
        DersID
       ,OgrenciNo
       ,Cevaplar
      )
    VALUES
      (
        55
       ,980
       ,'CAEDABCEDA'
      )
    INSERT INTO @Tablo
      (
        DersID
       ,OgrenciNo
       ,Cevaplar
      )
    VALUES
      (
        56
       ,879
       ,'BACDACBBCA'
      )
    INSERT INTO @Tablo
      (
        DersID
       ,OgrenciNo
       ,Cevaplar
      )
    VALUES
      (
        55
       ,991
       ,'DDDDACEDDA'
      )
    INSERT INTO @Tablo
      (
        DersID
       ,OgrenciNo
       ,Cevaplar
      )
    VALUES
      (
        55
       ,120
       ,'EECCDADBCA'
      )
    
    
    
    SELECT *
    FROM   @Tablo A
           CROSS APPLY dbo.SPLIT(A.Cevaplar) B


    Öğrenmek,öğrenmek...

    4 Nisan 2012 Çarşamba 15:16
  • O @Tablo sadece sizin platformunuzu olusturup, kendim test etmek icn yarattigim bi declaration.

    Kendi tablolariniza gore code'u uyarlamaniz gerekiyor.

    Kolay gelsin.


    http://www.yigitaktan.com

    4 Nisan 2012 Çarşamba 18:57
  • Yiğit Bey şöyle bir function denedim.

    CREATE FUNCTION [dbo].[fnParseStringTSQL] (@string NVARCHAR(MAX))
    RETURNS @retTable TABLE (SoruNumarasi int,SoruCevabi varchar(MAX))
    AS 
    BEGIN
       DECLARE @position int = 1
       DECLARE @length int
       SET @length = LEN(@string)
       WHILE 1 = 1
        BEGIN
            INSERT INTO @retTable
            SELECT @position,substring(@string, @position, 1)
            SET @position = @position + 1
            IF(@position = @length+1)
                BREAK;
        END
        RETURN
    END
    
    SELECT * FROM dbo.fnParseStringTSQL('ABCDEABCDE');


    Öğrenmek,öğrenmek...

    • Yanıt Olarak İşaretleyen geek-mind 5 Nisan 2012 Perşembe 11:02
    • Yanıt İşaretini Geri Alan geek-mind 5 Nisan 2012 Perşembe 15:09
    5 Nisan 2012 Perşembe 10:36
  • Serdar,

    Bildigim kadariyla .Net kullaniyorsun. Eger dogruysa, SQL server kisminda hic ugrasmasan bununla ve .Net kodu yazsan, ya da SQL server function kodunu bildigin .Net dilinde yazip veri tabanina eklesen (CLR user defined function)? Gunun birinde baska bir veri tabani ile de ayni seyi rahatlikla kullanirsin o zaman diye dusunuyorum. Ornek:

    var data = from cevap in Sinav.AsEnumerable()
                 select new {
                   dersID = cevap.DersID,
                   ogrenciNo = cevap.OgrenciNo,
                   Cevaplar = cevap.Cevaplar.ToCharArray().Select ((c,ndx) => new {
                   soruID = ndx+1,
                   cevap = c,
                   sira = c - 'A' + 1
                   })
                       
                 };

    Soyle bir sonuc cikiyor:

    IEnumerable<> (1 item)  
    dersID ogrenciNo 55 999 IEnumerable<> (10 items)  
    soruID cevap sira  
    1 A 1  
    2 B 2  
    3 C 3  
    4 D 4  
    5 A 1  
    6 C 3  
    7 D 4  
    8 B 2  
    9 C 3  
    10 A 1  
       
               

    Not: Goruntu formati bozuldu ekleyince ama tahmin edebilirsin.


    • Düzenleyen CetinBasoz 5 Nisan 2012 Perşembe 12:13
    5 Nisan 2012 Perşembe 12:11
  • İki farklı database birleştirme yaptığım için 

    SP,Function kullanmak zorundayım.

    İlginiz için teşekkürler.


    Öğrenmek,öğrenmek...

    5 Nisan 2012 Perşembe 12:36
  • İki farklı database birleştirme yaptığım için 

    SP,Function kullanmak zorundayım.

    İlginiz için teşekkürler.


    Öğrenmek,öğrenmek...


    !!!! Ben de bu durumda Linq kullanmak daha buyuk gereksinim diye dusunuyordum:)
    5 Nisan 2012 Perşembe 12:53
  • Merhaba Serdar,

    Senin denedigin function ile benim sana yazdigim function arasinda hicbir fark yok. Ayni result set'i uretiyorlar. Table declaration yapmamin nedeni de oncesinde de dedigim gibi senin table yapini ornek olarak denemek ve senin de ayni sekilde daha kolay anlaman icindi.

     

    Takdir edersin ki, burasi sadece bir forum ortami ve maalesef bu kadar yardimci olabilecegim.

    Icerik geregi, taktir goren cozum yolunun sunulmasi ve ornekleme ile yardimci olmaktir. Serkan hocam daha dogrusunu soleyecektir.

    Tesekkurler,

    Kolay gelsin.


    http://www.yigitaktan.com

    5 Nisan 2012 Perşembe 14:34
  • Yiğit bey sanırım yanlış anlaşılma olmuş.

    Yardımcı olamadınız diye bir düşüncem olmadı.

    öyle bir durum ise özür dilerim


    Öğrenmek,öğrenmek...

    5 Nisan 2012 Perşembe 15:12