ĐÃ CHỈNH SỬA:
Tôi cảm thấy chết lặng - MatBailie đã chỉ ra một cách chính xác rằng giải pháp ban đầu của tôi không chính xác. Tôi thực sự luôn nghĩ rằng TRANSLATE('abc', 'abc', 'bcd')
lẽ ra phải trả về ddd nhưng, sau khi kiểm tra BẢN DỊCH của SQL Server 2017, tôi thấy rằng 'bcd' sẽ là câu trả lời chính xác. Bạn có thể xem bản gốc (phiên bản không chính xác) của tôi bằng cách xem lịch sử của bài đăng này. Đây là giải pháp cập nhật sử dụng 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)');
Trả lại > bcd