none
T-Sql - Satırı Belli Sayıda Tekrarlatmak RRS feed

  • Soru

  • Merhaba arkadaşlar,şöyle bir sorunum var.

    2 farklı database birleştirmeye çalışıyorum bu aktarım birleştirmede zorlandım bayağı. :)

    Soru sayı kadar satırları tekrarlatmak istiyorum.

    Örnek olarak SoruSayisi 23 o satırı 23 kere tekrarlatmak istiyorum.Bunu nasıl yapabilirim.

    WHILE UNION ALL ile denedim ama yapamadım.

    SoruSayisi Cevaplar OgrenciID DersAdi DersID
    23 DAABCCADACBCA ACBDBCCDC 289 Türkçe 8705
    20 ADBDBBDCBAC *CBACBCA 289 Matematik 8706
    20 CDACBBBDBBCCAADBCCDB 289 Fen ve Teknoloji 8707
    20 ADBCADBCCDD ABDCADDB 289 Sosyal Bilgiler 8708
    17 CACDABDCBDADBBCAB 289 Yabancı Dil 8709


    Öğrenmek,öğrenmek...

    6 Nisan 2012 Cuma 07:27

Yanıtlar

  • Merhaba Serdar,

    Bir kaydı istediğin kadar tekrarlamak için bir NumbersTable yada sayı tablosundan yararlanabiliriz.

    Bu örnekteki SQL numbers table kodu için ilgili linke bakabilirsin. Aslında bu bir sayı tablosu döndüren fonksiyon.

    Sayı tablosunu Cross Apply operatörü ile ana tabloya bağladığımızda istediğin sonuca ulaşabiliriz.

    Aşağıdaki örnek umarım işine yarar

    SELECT *
    FROM tablo t
    Cross Apply dbo.NumbersTable(1,t.tekrar,1) n


    SQL Server, SQL Server 2012 Denali and T-SQL Tutorials

    • Yanıt Olarak Öneren eralper 6 Nisan 2012 Cuma 11:51
    • Yanıt Olarak İşaretleyen Serkan Bark 9 Nisan 2012 Pazartesi 09:42
    6 Nisan 2012 Cuma 11:39
  • eralper teşekkürler. :)

    Sql tarafında aşağıdaki şekilde çözdük.

    SELECT
        *
    FROM Ogrenci_Sinav_Test_Cevaplar as C
    CROSS APPLY    dbo.fnParseStringTSQL(C.Sinav_Test_Ders_id,C.Cevaplar) B 

    WHERE B.DersID = C.Sinav_Test_Ders_id

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


    Öğrenmek,öğrenmek...

    • Yanıt Olarak Öneren eralper 6 Nisan 2012 Cuma 11:51
    • Yanıt Olarak İşaretleyen Serkan Bark 9 Nisan 2012 Pazartesi 09:42
    6 Nisan 2012 Cuma 11:46

Tüm Yanıtlar

  • Tablonuzun adinin DERSLER olduğunu varsaydım

    WITH cte1 AS
    (select 1 SIRA,SoruSayisi, Cevaplar, OgrenciID, DersAdi, DersID
    FROM DERSLER
    UNION ALL
    select SIRA+1,SoruSayisi, Cevaplar, OgrenciID, DersAdi, DersID
    FROM cte1 where SIRA < SoruSayisi
    )

    select * from cte1
    order by OgrenciID,DersID,SIRA

    • Yanıt Olarak Öneren eralper 6 Nisan 2012 Cuma 11:51
    6 Nisan 2012 Cuma 10:50
  • Merhaba Serdar,

    Bir kaydı istediğin kadar tekrarlamak için bir NumbersTable yada sayı tablosundan yararlanabiliriz.

    Bu örnekteki SQL numbers table kodu için ilgili linke bakabilirsin. Aslında bu bir sayı tablosu döndüren fonksiyon.

    Sayı tablosunu Cross Apply operatörü ile ana tabloya bağladığımızda istediğin sonuca ulaşabiliriz.

    Aşağıdaki örnek umarım işine yarar

    SELECT *
    FROM tablo t
    Cross Apply dbo.NumbersTable(1,t.tekrar,1) n


    SQL Server, SQL Server 2012 Denali and T-SQL Tutorials

    • Yanıt Olarak Öneren eralper 6 Nisan 2012 Cuma 11:51
    • Yanıt Olarak İşaretleyen Serkan Bark 9 Nisan 2012 Pazartesi 09:42
    6 Nisan 2012 Cuma 11:39
  • eralper teşekkürler. :)

    Sql tarafında aşağıdaki şekilde çözdük.

    SELECT
        *
    FROM Ogrenci_Sinav_Test_Cevaplar as C
    CROSS APPLY    dbo.fnParseStringTSQL(C.Sinav_Test_Ders_id,C.Cevaplar) B 

    WHERE B.DersID = C.Sinav_Test_Ders_id

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


    Öğrenmek,öğrenmek...

    • Yanıt Olarak Öneren eralper 6 Nisan 2012 Cuma 11:51
    • Yanıt Olarak İşaretleyen Serkan Bark 9 Nisan 2012 Pazartesi 09:42
    6 Nisan 2012 Cuma 11:46