• 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.