Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Função TRANSLATE no SQL SERVER


EDITADO:

Estou me sentindo burro - MatBailie apontou corretamente que minha solução original estava incorreta. Na verdade, sempre pensei que TRANSLATE('abc', 'abc', 'bcd') deveria retornar ddd, mas, depois de testar o TRANSLATE do SQL Server 2017, vejo que 'bcd' seria a resposta correta. Você pode ver meu original (versão incorreta) olhando para este histórico deste post. Aqui está uma solução atualizada 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)');

Devoluções> bcd