Esta é uma pergunta sobre "mais rápido", então os horários são fornecidos abaixo
Configuração de teste, tabela com>1 milhão de linhas
create table MetaDataServe (id int identity primary key, vc varchar(max));
insert MetaDataServe values
('MindWorks.Accounts'),
('MindWorks.Transactions'),
('MindWorks.Commissions');
insert MetaDataServe
select vc
from MetaDataServe, master..spt_values a, master..spt_values b
where b.number between 1 and 30
-- (1090110 row(s) affected)
Coisas x Substituir x SubString
Resumo de desempenho - STUFF> SUBSTRING> REPLACE
update MetaDataServe set vc = STUFF(vc, 9, 0, '.Client')
(os 2 tempos são de várias execuções para mostrar a variabilidade, é bastante baixo para que os tempos possam ser considerados precisos dentro de 3%)
update MetaDataServe set vc = REPLACE(vc, '.', '.Client.')
update MetaDataServe set vc = 'MindWorks.Client.' + SUBSTRING(vc, 11, 100)
Número fixo vs PATINDEX vs CHARINDEX
(A versão de posição fixa já é fornecida acima)
Resumo de desempenho - CORRIGIDO> (PATINDEX =CHARINDEX)
update MetaDataServe set vc = STUFF(vc, PATINDEX('%.%',vc), 0, '.Client')
update MetaDataServe set vc = STUFF(vc, CHARINDEX('.',vc), 0, '.Client')
Observações:
- Todas as instruções de atualização fornecidas acima funcionarão (com um ou dois ajustes) dependendo de suas necessidades
- Antes de cada teste, a tabela inteira é descartada e recriada para evitar problemas de armazenamento em cache
CUIDADO!
Mesmo que o STUFF seja mais rápido, você pode entrar em situações complicadas. Se os seus dados contiverem
"MindWorksNoDot"
E você atualiza usando
update MetaDataServe set vc = STUFF(vc, CHARINDEX('.',vc), 0, '.Client')
Você acaba com NULL! Porque quando CHARINDEX não consegue encontrar o ponto, o segundo parâmetro para STUFF de zero (0) faz com que toda a string vá para NULL .
PALAVRAS FINAIS
Para segurança e confiabilidade, dado que é apenas 33% mais lento que a abordagem STUFF, eu simplesmente usaria uma instrução REPLACE, ou seja,
update MetaDataServe set vc = REPLACE(vc, '.', '.Client.')