Предполагая, что между каждым "столбцом" есть как минимум ДВА пробела.
При перекрестном применении B будет создана "чистая" строка с разделителями трубы ( Спасибо, Гордон! )
Cross Apply C проанализирует новую строку с разделителем трубы в 3 столбца
Пример
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
Возвращает
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