This will work on SQL Server 2005 and SQL Server 2008. I assumed that your first digit sequence is mapped to 2-digit groups of 1, 2, or 3. You can do this with fewer cascading CTEs, but I find the syntax SUBSTRING / CHARINDEX / LEN can quickly become very difficult to read and debug.
DECLARE @foo TABLE ( bar VARCHAR(4000) ); INSERT @foo(bar) SELECT '00 Not specified' UNION ALL SELECT '01-05 Global WM&BB | Operations' UNION ALL SELECT '02-05-01 Global WM&BB | Operations | Operations n/a'; WITH split1 AS ( SELECT n = SUBSTRING(bar, 1, CHARINDEX(' ', bar)-1), w = SUBSTRING(bar, CHARINDEX(' ', bar)+1, LEN(bar)), rn = ROW_NUMBER() OVER (ORDER BY bar) FROM @foo ), split2 AS ( SELECT rn, cat1 = LEFT(n, 2), wl = RTRIM(SUBSTRING(w, 1, COALESCE(NULLIF(CHARINDEX('|', w), 0)-1, LEN(w)))), wr = LTRIM(SUBSTRING(w, NULLIF(CHARINDEX('|', w),0) + 1, LEN(w))), cat2 = NULLIF(SUBSTRING(n, 4, 2), ''), cat3 = NULLIF(SUBSTRING(n, 7, 2), '') FROM split1 ), split3 AS ( SELECT rn, cat1descr = wl, cat2descr = RTRIM(SUBSTRING(wr, 1, COALESCE(NULLIF(CHARINDEX('|', wr), 0)-1, LEN(wr)))), cat3descr = LTRIM(SUBSTRING(wr, NULLIF(CHARINDEX('|', wr),0) + 1, LEN(wr))) FROM split2 ) SELECT s2.cat1, s3.cat1descr, s2.cat2, s3.cat2descr, s2.cat3, s3.cat3descr FROM split2 AS s2 INNER JOIN split3 AS s3 ON s2.rn = s3.rn;