BEWERKT:
Ik voel me dom - MatBailie wees er terecht op dat mijn oorspronkelijke oplossing onjuist was. Ik dacht eigenlijk altijd dat TRANSLATE('abc', 'abc', 'bcd')
moest ddd retourneren, maar na het testen van SQL Server 2017's TRANSLATE zie ik dat 'bcd' het juiste antwoord zou zijn. Je kunt mijn origineel (onjuiste versie) zien door naar deze geschiedenis van dit bericht te kijken. Hier is een bijgewerkte oplossing die gebruikmaakt van 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)');
Retourneren> bcd