• Personally, I would use a different function, a WHILE loop isn't going to perform well and nor is a scalar function. This uses Alan Burstein's NGrams8K: http://www.sqlservercentral.com/articles/Tally+Table/142316/.

    After you have that function, you can create the function to remove the non-numeric values:
    CREATE FUNCTION dbo.RemoveNonNumeric (@Phone varchar(8000)) RETURNS TABLE
    AS RETURN

      SELECT (SELECT N.token + ''
        FROM dbo.NGrams8k(@Phone,1) N
        WHERE N.token LIKE '[0-9]'
        ORDER BY N.position
        FOR XML PATH('')) AS PhoneNum
    GO

    Now you can call it easily using APPLY. For example:
    WITH VTE AS (
      SELECT *
      FROM (VALUES ('123-456,789'),
          ('1245,6957,4'),
          ('12346 647247')) V(Phone))
    SELECT *
    FROM VTE V
      CROSS APPLY RemoveNonNumeric(V.Phone) RNN;
    GO

    Thom~

    Excuse my typos and sometimes awful grammar. My fingers work faster than my brain does.
    Larnu.uk