none
Tablodaki Virgüllü Verileri Parçalı Bir Şekilde Çekme RRS feed

  • Soru

  • Merhaba,

    Veritabanında 9 adet sütun var bunların hepsinin içerisinde veriler virgüllü bir şekilde tutuluyor örneğin elma,armut,kivi gibi

    benim daha sonra bu virgül ile tutulan verileri parçalı bir şekilde alt altta sıralamam lazım örnek aşağıdaki gibi

    Element1    Element2    Element3    Element4    Element5    Element6    Element7     Element8    Element9
    -----------------------------------------------------------------------------------------------------------------------
    Elma          Karpuz
    Armut        Kavun
    Kivi            vs...

    .......

    Bende çözüm olarak aşağıdaki gibi yaptım..

    İlk Önce func_Split fonksiyonu tanımladım kodları aşağıda

    ALTER FUNCTION [dbo].[func_Split] 
        (   
        @DelimitedString1    varchar(8000),
        @Delimiter              varchar(100) 
        )
    RETURNS @tblArray TABLE
        (
        Element1     varchar(1000)
        )
    AS
    BEGIN
    
    
        DECLARE @Index      smallint,
                        @Start      smallint,
                        @DelSize    smallint
    
        SET @DelSize = LEN(@Delimiter)
    
     
        WHILE LEN(@DelimitedString1) > 0
        BEGIN
    
            SET @Index = CHARINDEX(@Delimiter, @DelimitedString1)
    
            IF @Index = 0
                BEGIN
    
                    INSERT INTO
                        @tblArray 
                        (Element1)
                    VALUES
                        (LTRIM(RTRIM(@DelimitedString1)))
    
                    BREAK
    
                END
            ELSE
                BEGIN
    			
                    INSERT INTO
                        @tblArray 
                        (Element1)
                    VALUES
                        (LTRIM(RTRIM(SUBSTRING(@DelimitedString1, 1,@Index - 1))))
    
                    SET @Start = @Index + @DelSize
                    SET @DelimitedString1 = SUBSTRING(@DelimitedString1, @Start , LEN(@DelimitedString1) - @Start + 1)
    
                END
        END
    
    
    
        RETURN
    END
    
    

    Daha sonra stored procedur ile verileri birleştirip çekmeye çalıştım kod aşağıda

    ALTER procedure [dbo].[OtelOzllkGtr_tr]
    (
    @Link varchar(250)
    )
    as
    begin
    DECLARE @Havuz varchar(100)
    DECLARE @YiyecekIcecek varchar(100)
    DECLARE @EglenceHzmtleri varchar(100)
    DECLARE @OrtakAlanlar varchar(100)
    DECLARE @Cocuk varchar(100)
    DECLARE @Bebek varchar(100)
    DECLARE @Reception varchar(100)
    DECLARE @Ulasim varchar(100)
    DECLARE @Engelli varchar(100)
    
    SELECT @Havuz = Havuz, @YiyecekIcecek = YiyecekIcecek, @EglenceHzmtleri = EglenceHzmtleri, @OrtakAlanlar = OrtakAlanlar, @Cocuk = Cocuk, @Bebek = Bebek, @Reception = Reception, @Ulasim = Ulasim, @Engelli = Engelli from OtelOzellikleri_tr where Link = @Link
    
    
    
    
    
    SELECT mt.Element1 as Element1, fs.Element1 as Element2, fs2.Element1 as Element3, fs3.Element1 as Element4, fs4.Element1 as Element5, fs5.Element1 as Element6, fs6.Element1 as Element7, fs7.Element1 as Element8, fs8.Element1 as Element9
    FROM   dbo.func_split(@Havuz, ',') mt 
        CROSS APPLY dbo.func_split(@YiyecekIcecek, ',') AS fs CROSS APPLY dbo.func_split(@EglenceHzmtleri, ',') AS fs2
    	CROSS APPLY dbo.func_split(@OrtakAlanlar, ',') AS fs3
    	CROSS APPLY dbo.func_split(@Cocuk, ',') AS fs4
    	CROSS APPLY dbo.func_split(@Bebek, ',') AS fs5
    	CROSS APPLY dbo.func_split(@Reception, ',') AS fs6
    	CROSS APPLY dbo.func_split(@Ulasim, ',') AS fs7
    	CROSS APPLY dbo.func_split(@Engelli, ',') AS fs8
    
    
    
    end

    Sonuç verileri alt altta parçalı bir şekilde sıralayabiliyorum fakat normalde 5 - 6 satır olması gerek tablo 262144 satır oluyor
    yani kendini tekrar tekrar yazıyor resim eklemeye çalıştım fakat ekleyemiyorum.


    21 Temmuz 2017 Cuma 08:22

Tüm Yanıtlar

  • Merhabalar,

    Öncelikle şunu belirteyim. 9 kolonun hepsini aynı anda cross apply yapmak istediğiniz için cross join mantığıyla kartezyen çarpımı çıkıyor karşınıza. Sanırım normalde 4 kayıt veriniz var, dolayısyla 4^9 adet kayıt çıkıyor karşınıza. Bunları ayrı ayrı cross apply yapıp sonrasında birleşitrmeyi deneyebilir misiniz? sanırım bu şekilde istediğiniz olacaktır...

    Umarım faydalı olur...


    Please Mark This As Answer if it solved your issue
    Please Vote This As Helpful if it helps to solve your issue
    www.abdullahaltintas.com

    21 Temmuz 2017 Cuma 09:16
  • Kodları aşağıdaki gibi yapınca veriler düzgün geliyor fakat tablolar parça parça bunları cross apply dışında ne ile bağlayabilirim?

    Select Element1 from dbo.func_split(@Havuz, ',')
    	Select Element1 as Element2 from dbo.func_split(@YiyecekIcecek, ',')
    	Select Element1 as Element3 from dbo.func_split(@EglenceHzmtleri, ',')
    	Select Element1 as Element4  from dbo.func_split(@OrtakAlanlar, ',')
    	Select Element1 as Element5  from dbo.func_split(@Cocuk, ',')
    	Select Element1 as Element6  from dbo.func_split(@Bebek, ',')
    	Select Element1 as Element7  from dbo.func_split(@Reception, ',')
    	Select Element1 as Element8  from dbo.func_split(@Ulasim, ',')
    	Select Element1 as Element9  from dbo.func_split(@Engelli, ',')

    21 Temmuz 2017 Cuma 12:56
  • Merhaba İbrahim Çoban,

    SQL Server'ın hangi versiyonunu kullandığını belirtmemişsin, ek bilgi olarak paylaşmak istedim, SQL Server 2016 ile birlikte STRING_SPLIT adında yeni bir built-in function geldi. Bu versiyondaysan ve Compatibility Level'ın 130 ise String'leri parçalamak için bundan da faydalanabilirsin. 


    http://ekremonsoy.blogspot.com | http://www.ekremonsoy.com | @EkremOnsoy

    3 Ağustos 2017 Perşembe 07:13