My tableA col1 has three values and separated by various length. I need to separate it and into three columns and place it into Z1, Z2, and Z3 respectively. Also, on some individual value has spaces in between too for example ‘Windows XP Professional’ but I need it make it as individual value. Any ideas? See sample below.Thanks.
Current
Col Z1 Z2 Z3 -------------------------------------------------------------------------- ----- ----- ---- Windows XP Professional SP3 CD RWT-00543 Windows XP N/A N/A Windows CE .NET v5.00 CD TRE-00298 in vault Client Ctrl firmware N/A
After
Col                                          Z1                   Z2              Z3
------------------------------------     -------------          -----           ----
                                      Windows XP Professional     SP3        PP RWT-00543
                                         Windows XP               N/A             N/A
                                       Windows CE .NET           v5.00       QQ TRE-00298 in vault
                                        Client Ctrl firmware      N/A
Advertisement
Answer
Assuming there are at least TWO spaces between each “column”.
Cross Apply B will create a “clean” pipe delimited string” (Thanks Gordon!)
Cross Apply C will parse the new pipe delimited string into 3 columns
Example
Declare @YourTable Table ([Col] varchar(500))
Insert Into @YourTable Values 
 ('Windows XP Professional     SP3                       CD RWT-00543')
,('Windows XP                    N/A                          N/A')
,('Windows CE .NET             v5.00               CD TRE-00298 in vault')
,('Client Ctrl firmware      N/A')
Select C.* 
 From  @YourTable A
 Cross Apply ( values ( ltrim(rtrim(replace(replace(replace([Col],'  ','†‡'),'‡†',''),'†‡','|'))) ) ) B(CleanString)
 Cross Apply (
                Select Pos1 = ltrim(rtrim(xDim.value('/x[1]','varchar(max)')))
                      ,Pos2 = ltrim(rtrim(xDim.value('/x[2]','varchar(max)')))
                      ,Pos3 = ltrim(rtrim(xDim.value('/x[3]','varchar(max)')))
                From  ( values (cast('<x>' + replace((Select replace(CleanString,'|','§§Split§§') as [*] For XML Path('')),'§§Split§§','</x><x>')+'</x>' as xml)))  A(xDim)
             ) C
Returns
Pos1 Pos2 Pos3 Windows XP Professional SP3 CD RWT-00543 Windows XP N/A N/A Windows CE .NET v5.00 CD TRE-00298 in vault Client Ctrl firmware N/A NULL