EDYTOWANO:
Czuję się głupio - MatBailie słusznie zauważył, że moje oryginalne rozwiązanie było błędne. Właściwie zawsze myślałem, że TRANSLATE('abc', 'abc', 'bcd')
miał zwrócić ddd, ale po przetestowaniu TRANSLATE SQL Server 2017 widzę, że 'bcd' byłoby poprawną odpowiedzią. Możesz zobaczyć moją oryginalną (nieprawidłową wersję) przeglądając historię tego posta. Oto zaktualizowane rozwiązanie, które wykorzystuje ngrams8k
:
DECLARE
@string varchar(8000) = 'abc',
@fromChar varchar(100) = 'abc', -- note: no mutation
@toChar varchar(100) = 'bcd';
SELECT newString =
(
SELECT CASE WHEN x>z THEN '' WHEN x>0 THEN s ELSE t END+''
FROM dbo.ngrams8k(@string,1) ng
CROSS APPLY (VALUES (charindex(ng.token,@fromChar),len(@toChar),ng.token)) x(x,z,t)
CROSS APPLY (VALUES (ng.position, substring(@toChar,x.x,1))) xx(p,s)
ORDER BY xx.p
FOR XML PATH(''), TYPE
).value('(text())[1]', 'varchar(8000)');
Zwroty> bcd