Soran
Tablodaki Virgüllü Verileri Parçalı Bir Şekilde Çekme

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.
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 -
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, ',')
-
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