Here's my test version of a function using the technique discussed in Jeffs article that was already mentioned. You'll probably want to really test it out under your required conditions and make sure I don't mess you up because I'm not Jeff 🙂
Ran at least once in sql 2000 LOL
CREATE FUNCTION dbo.FN_LIST2TAB
(
@LIST_IN VARCHAR(1000),
@DELIM_IN VARCHAR(1)
)
RETURNS TABLE
RETURN
SELECT
SUBSTRING(@DELIM_IN + @LIST_IN + @DELIM_IN, TALLY1 + 1,
CHARINDEX(@DELIM_IN,@DELIM_IN + @LIST_IN + @DELIM_IN,TALLY1 + 1) - TALLY1 - 1) ACTUAL_COLUMN
FROM
(
SELECT TALLY1 FROM
(
SELECT D.VAL1 * 1000 + C.VAL1 * 100 + B.VAL1 * 10 + A.VAL1 TALLY1 FROM
(
SELECT 0 VAL1 UNION SELECT 1 VAL1 UNION SELECT 2 VAL1 UNION SELECT 3 VAL1 UNION SELECT 4 VAL1 UNION
SELECT 5 VAL1 UNION SELECT 6 VAL1 UNION SELECT 7 VAL1 UNION SELECT 8 VAL1 UNION SELECT 9 VAL1
) A
CROSS JOIN
(
SELECT 0 VAL1 UNION SELECT 1 VAL1 UNION SELECT 2 VAL1 UNION SELECT 3 VAL1 UNION SELECT 4 VAL1 UNION
SELECT 5 VAL1 UNION SELECT 6 VAL1 UNION SELECT 7 VAL1 UNION SELECT 8 VAL1 UNION SELECT 9 VAL1
) B
CROSS JOIN
(
SELECT 0 VAL1 UNION SELECT 1 VAL1 UNION SELECT 2 VAL1 UNION SELECT 3 VAL1 UNION SELECT 4 VAL1 UNION
SELECT 5 VAL1 UNION SELECT 6 VAL1 UNION SELECT 7 VAL1 UNION SELECT 8 VAL1 UNION SELECT 9 VAL1
) C
CROSS JOIN
(
SELECT 0 VAL1 UNION SELECT 1 VAL1 UNION SELECT 2 VAL1 UNION SELECT 3 VAL1 UNION SELECT 4 VAL1 UNION
SELECT 5 VAL1 UNION SELECT 6 VAL1 UNION SELECT 7 VAL1 UNION SELECT 8 VAL1 UNION SELECT 9 VAL1
) D
) TALLYTAB
) LISTBUILDER
WHERE SUBSTRING(@DELIM_IN + @LIST_IN + @DELIM_IN,TALLY1,1) = @DELIM_IN AND TALLY1 < LEN(@DELIM_IN + @LIST_IN + @DELIM_IN)