DIEDIT:
Saya merasa bodoh - MatBailie dengan benar menunjukkan bahwa solusi asli saya salah. Saya sebenarnya selalu berpikir bahwa TRANSLATE('abc', 'abc', 'bcd')
seharusnya mengembalikan ddd tetapi, setelah menguji TRANSLATE SQL Server 2017 saya melihat bahwa 'bcd' akan menjadi jawaban yang benar. Anda dapat melihat versi asli saya (versi salah) dengan melihat riwayat posting ini. Berikut adalah solusi terbaru yang menggunakan 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)');
Pengembalian> bcd