Nice. I would have thought it the same way 🙂 But I think the self join can be omitted
;WITH Tally(N) AS (SELECT ROW_NUMBER() OVER(ORDER BY (SELECT NULL))
FROM(VALUES(0),(0),(0),(0),(0),(0),(0),(0),(0),(0))a(N))
SELECT A,B,stripped
FROM TXNS b
CROSS APPLY (SELECT (SELECT CASE WHEN PATINDEX('[A-Za-z0-9]',SUBSTRING(B,N,1)) = 1
THEN SUBSTRING(B,N,1)
ELSE '' END
FROM Tally
WHERE N <= LEN(B)
FOR XML PATH(''), TYPE
).value('.', 'VARCHAR(10)') ) c(stripped)
For easier readability we can omit TYPE and value combination as well as we are dealing with only alphanumeric values.