Such kind of things is better to do in CLR or in application. But if you strongly need to do this in TSQL, so here is an example:
DECLARE @D TABLE ( s NVARCHAR(1000), id INT )
INSERT INTO @D
( s, id )
VALUES ( '8181234$564', 1 ),
( '(818) 123 %&%%4564', 2 ),
( '818 - 123 - 4567', 3 ) ;
WITH c ( s, Char, pos, id, Out )
AS ( SELECT d.s ,
SUBSTRING(d.s, 1, 1) ,
CAST(1 AS BIGINT) ,
d.id ,
CASE WHEN SUBSTRING(d.s, 1, 1) IN ( '1', '2', '3', '4',
'5', '6', '7', '8',
'9', '0' )
THEN CAST(SUBSTRING(d.s, 1, 1) AS NVARCHAR)
ELSE ''
END
FROM @d D
UNION ALL
SELECT d.s ,
SUBSTRING(d.s, c.pos + 1, 1) ,
c.pos + 1 ,
d.id ,
CASE WHEN SUBSTRING(d.s, c.pos + 1, 1) IN ( '1', '2',
'3', '4', '5',
'6', '7', '8',
'9', '0' )
THEN CAST(c.Out + SUBSTRING(d.s, c.pos + 1, 1) AS NVARCHAR)
ELSE c.Out
END
FROM @d D
JOIN C ON c.id = d.id
WHERE c.pos < LEN(c.s)
)
SELECT c.s [In] ,
c.Out
FROM c
JOIN ( SELECT MAX(c2.pos) MaxPos ,
s
FROM c C2
GROUP BY C2.s
) CC ON cc.s = c.s
AND c.pos = cc.MaxPos