2016-08-09 460 views
0

enter image description hereSplit eine Saite in einer Zelle mit variabler Teilzeichenlängen in verschiedene Spalten mit SQL

Im Folgenden finden Sie die Daten ich verwende. Ich benutze Jaspersoft Studio Version 6.3 und SQL Server 2012. Meine Frage ist, wie teilen Sie eine Zelle mit einer Zeichenfolge variabler Länge in mehrere Unterzeichenfolgen mit variabler Länge mit SQL-Code?

Beispiel:

Dies ist die Zeichenfolge

'MEM - CP NEW INSTALL - 000 - 519.83 - MEMPHIS - SHELBY - TN' 

dies die Ausgabe möchte ich bekommen:

MEM 
CP NEW INSTALL 
000 
519.83 
MEMPHIS 
SHELBY 
TN 

jeweils in einer separaten Spalte.

Jeder von ihnen hat eine variable Länge und ich versuche, für importierte Daten

+1

Sie benötigen diese Splitter mit einem String zu tun. Hier sind einige ausgezeichnete Optionen hier. http://sqlperformance.com/2012/07/t-sql-queries/split-strings Dann, wenn überhaupt möglich, sollten Sie aufhören, mehrere Werte in einer einzelnen Zelle wie folgt zu speichern, es verletzt 1NF. –

+2

Mögliches Duplikat von [Wie werden einzelne Spaltenwerte in mehrere Spaltenwerte aufgeteilt?] (Http://stackoverflow.com/questions/5123585/how-to-split-a-single-column-values-to-multiple-column -Werte) & [Wie man einen durch Komma getrennten Wert in Spalten aufteilt] (http://stackoverflow.com/q/10581772/876298) –

+0

Ich habe diese Alex ausprobiert und habe den ersten Teil zur Arbeit gebracht, aber die anderen Teile haben gewonnen ' t zeigen. so dass Code für meinen Fall nicht funktioniert – carp47

Antwort

1

Vielleicht so etwas wie dies eine verallgemeinerte Code zu machen.

Declare @String varchar(max) = 'MEM - CP NEW INSTALL - 000 - 519.83 - MEMPHIS - SHELBY - TN' 
Select * from [dbo].[udf-Str-Parse-Row](@String,' - ') 

Returns

Pos1 Pos2   Pos3 Pos4 Pos5 Pos6 Pos7 Pos8 Pos9 
MEM  CP NEW INSTALL 000  519.83 MEMPHIS SHELBY TN  NULL NULL 

Die UDF - Einfach genug, um Ihre Bedürfnisse anzupassen/size

CREATE FUNCTION [dbo].[udf-Str-Parse-Row] (@String varchar(max),@Delimeter varchar(10)) 
--Usage: Select * from [dbo].[udf-Str-Parse-Row]('Dog,Cat,House,Car',',') 
--  Select * from [dbo].[udf-Str-Parse-Row]('John Cappelletti',' ') 
--  Select * from [dbo].[udf-Str-Parse-Row]('id26,id46|id658,id967','|') 

Returns Table 

As 

Return (
    SELECT Pos1 = xDim.value('/x[1]','varchar(250)') 
      ,Pos2 = xDim.value('/x[2]','varchar(250)') 
      ,Pos3 = xDim.value('/x[3]','varchar(250)') 
      ,Pos4 = xDim.value('/x[4]','varchar(250)') 
      ,Pos5 = xDim.value('/x[5]','varchar(250)') 
      ,Pos6 = xDim.value('/x[6]','varchar(250)') 
      ,Pos7 = xDim.value('/x[7]','varchar(250)') 
      ,Pos8 = xDim.value('/x[8]','varchar(250)') 
      ,Pos9 = xDim.value('/x[9]','varchar(250)') 
    FROM (Select Cast('<x>' + Replace(@String,@Delimeter,'</x><x>')+'</x>' as XML) as xDim) A 
) 

Eine weitere Option ist der Standard (mit Reihe nr) Parsen und dann können Sie schwenken nach Bedarf

Select * from [dbo].[udf-Str-Parse](@String,' - ') 

Returns

Key_PS Key_Value 
1  MEM 
2  CP NEW INSTALL 
3  000 
4  519.83 
5  MEMPHIS 
6  SHELBY 
7  TN 

Die zweite UDF

CREATE FUNCTION [dbo].[udf-Str-Parse] (@String varchar(max),@Delimeter varchar(10)) 
--Usage: Select * from [dbo].[udf-Str-Parse]('Dog,Cat,House,Car',',') 
--  Select * from [dbo].[udf-Str-Parse]('John Cappelletti was here',' ') 

Returns @ReturnTable Table (Key_PS int IDENTITY(1,1), Key_Value varchar(max)) 
As 
Begin 
    Declare @XML xml;Set @XML = Cast('<x>' + Replace(@String,@Delimeter,'</x><x>')+'</x>' as XML) 
    Insert Into @ReturnTable Select Key_Value = ltrim(rtrim(String.value('.', 'varchar(max)'))) FROM @XML.nodes('x') as T(String) 
    Return 
End