Me siento tonto:MatBailie señaló correctamente que mi solución original era incorrecta. De hecho, siempre pensé que TRANSLATE('abc', 'abc', 'bcd')
se suponía que devolvería ddd pero, después de probar TRADUCIR de SQL Server 2017, veo que 'bcd' sería la respuesta correcta. Puede ver mi original (versión incorrecta) mirando este historial de esta publicación. Aquí hay una solución actualizada que usa 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)');
Devoluciones> bcd