En iyi yanıtlayıcılar
NVarchar - NText/Long NVarchar içindeki Verileri parser etmek

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...
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
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
-
-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!
-
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
-
-
-
-
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...
-
-
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...
-
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
-
-
-
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
-