I really don't like the WHILE loop in there.
I use this code, (which may or may not be from Jeff Moden) which requires a table of numbers from 1 to 8000:
ALTER FUNCTION dbo.TableFromList(@List varchar(8000))
RETURNS TABLE
AS RETURN
SELECT LTRIM(RTRIM(SUBSTRING(ListID, number+1, CHARINDEX(',', ListID, number+1)-number - 1))) AS Value
FROM (SELECT ',' + @List + ',' AS ListID) AS InnerQuery
JOIN Numbers n
ON n.Number < LEN(InnerQuery.ListID)
WHERE SUBSTRING(ListID, number, 1) = ','