I prefer this alternative. Not for performance reasons, mostly that it allows easier customization of the suffix chars to be assigned. Sometimes certain chars, such as I and O, are skipped because they look too much like numbers. Also, the logic below is clearer to me, although that could just be me.
;WITH cte_suffix_chars AS (
SELECT 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' AS suffix_chars
)
SELECT A.PONUMBER, A.PODATE,
A.PONUMBER + SUBSTRING(suffix_chars, ISNULL(CHARINDEX(POSUFFIX, suffix_chars) + rank_num, 1), 1) AS PONUMBERTOUSE
FROM (
SELECT *, DENSE_RANK() OVER(PARTITION BY PONUMBER ORDER BY PODATE) AS rank_num
FROM #PONUMBERTESTIMPORT
) AS A
CROSS JOIN cte_suffix_chars
LEFT OUTER JOIN (
SELECT LEFT(PONUMBER, LEN(PONUMBER) - 1) AS PONUMBER, MAX(RIGHT(PONUMBER, 1)) AS POSUFFIX
FROM #PONUMBERTEST
WHERE RIGHT(PONUMBER, 1) NOT LIKE '[0-9]'
GROUP BY LEFT(PONUMBER, LEN(PONUMBER) - 1)
) AS T ON T.PONUMBER = A.PONUMBER
SQL DBA,SQL Server MVP(07, 08, 09) A socialist is someone who will give you the shirt off *someone else's* back.