2016-05-15 22 views
1

Ich habe nach einer Lösung in StackOverflow gesucht, aber nichts nützliches gefunden. Ich stehe vor einem Problem und ich hoffe, dass mir jemand helfen möchte.Mehrere getrennte Werte in mehrere Zeilen teilen

Ich habe Wert wie folgt aus:

Create table DemoRecords 
(
    CustID int identity (1,1), 
    CustomerName varchar(50), 
    CurrencyCode varchar(50), 
    CurrentBalance varchar(50), 
    DateValue varchar(50) 
) 
GO 

INSERT INTO DemoRecords VALUES ('Mr. X', 'BDTýUSDýGBP','10500ý2500ý1050','20150101ý20150201ý20150301') 

..und ich brauche Ausgabe wie folgt: don (Bitte werfen Sie einen Blick auf das Bild unten angehängt)

enter image description here Picture

Bitte Ich empfehle, CTE zu verwenden, da mehr als 100 Spalten in dieser Tabelle vorhanden sind.

+0

Sie können eine einfache Schleife schreiben, um die Bits herauszuziehen, die Ihnen wichtig sind, und sie in Ihre Datenbank einfügen. –

+0

Hinweis: Auch nach dem Teilen der Werte müssen Sie den DateValue immer noch in einen tatsächlichen Datums-Datentyp umwandeln. –

+0

Könntest du bitte ein bisschen mehr erklären, weil ich total verwirrt bin :( –

Antwort

2

Hier ist eine Funktion zum Aufteilen einer Zeichenfolge in Zeilen. Darunter befindet sich eine Abfrage für Ihre Demorecords-Tabelle, die die Funktion verwendet, um das angeforderte Ergebnis zu erhalten.

create function dbo.split 
(
    @delimited nvarchar(max), 
    @delimiter nvarchar(5) 
) 
returns @rows table 
(
    rownumber int not null identity(1,1), 
    value nvarchar(max) not null 
) 
as 
begin 
    if @delimited is null return 

    declare @delr_len int = len(@delimiter) 
    declare @start_at int = 1 
    declare @end_at int 
    declare @deld_len int 

    while 1=1 
    begin 
     set @end_at = charindex(@delimiter,@delimited,@start_at) 
     set @deld_len = case @end_at when 0 then len(@delimited) else @[email protected]_at end 
     insert into @rows (value) values(substring(@delimited,@start_at,@deld_len)); 
     if @end_at = 0 break; 
     set @start_at = @end_at + @delr_len 
    end 

    return 
end 
go 


select custid, customername, currencycode=currencycode.value, currentbalance=currentbalance.value, datevalue=datevalue.value 
    from demorecords r 
    cross apply (select rownumber, value from dbo.split(r.currencycode,'ý')) currencycode 
    cross apply (select rownumber, value from dbo.split(r.currentbalance,'ý') where rownumber = currencycode.rownumber) currentbalance 
    cross apply (select rownumber, value from dbo.split(r.datevalue,'ý') where rownumber = currencycode.rownumber) datevalue 

Wenn Sie eine Spalte, die fehlende Werte enthalten können, verwenden Sie eine äußere Anwendung anstelle eines inneren gelten für diese Spalte das Ergebnis der Funktion zu verbinden. Im folgenden Beispiel wird die DatWert Spaltenwert fehlt 3 und den Wert 4.

INSERT INTO DemoRecords VALUES ('Mr. X', 'BDTýUSDýGBPýEUR','10500ý2500ý1050ý','ý') 

select custid, customername, currencycode=currencycode.value, currentbalance=currentbalance.value, datevalue=datevalue.value 
from demorecords r 
cross apply (select rownumber, value from dbo.split(r.currencycode,'ý')) currencycode 
cross apply (select rownumber, value from dbo.split(r.currentbalance,'ý') where rownumber = currencycode.rownumber) currentbalance 
outer apply (select rownumber, value from dbo.split(r.datevalue,'ý') where rownumber = currencycode.rownumber) datevalue 

Alternativ können Sie Ihre Eingabe nicht fehlen Werte aufzuräumen. Im obigen Beispiel würde ich erwarten, dass DateValue "nicht" ist. Wenn es Ihre Situation erlaubt, möchten Sie diese möglicherweise finden und beheben, ohne einen äußeren Join zu verwenden.

+0

Vielen Dank Matt Dolfin :) –

+0

Lieber Matt, ich habe ein Szenario. Könnten Sie bitte Ihre Funktion auf diese Daten unten ausführen und sehen, was passiert. INSERT IN DemoRecords VALUES ("Herr X", "BDTýUSDýGBPéEUR", "10500ý2500ý1050ý", "ý"). Die Zeilennummer stimmt nicht mit anderen Spalten überein, sodass die erwartete Ausgabe nicht angezeigt wird. –

+0

@Sajid Wasim, in Ihrem letzten Szenario fehlt DateValue der dritte und vierte Wert. Ich würde erwarten, dass es einen Wert von "ýýý" hat, nicht von "ý". Sie könnten einfach ein äußeres Anwenden anstelle eines inneren Anwendens verwenden, um dem Ergebnis der Funktion für diese Spalte beizutreten. Siehe meine aktualisierte Antwort. Oder Sie können Ihre Eingaben bereinigen, um die korrekte Anzahl von Spalten zu erhalten. –