Questa è una domanda sul "più veloce", quindi i tempi sono forniti di seguito
Impostazione di prova, tabella con>1 milione di righe
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)
Roba vs Sostituisci vs Sottostringa
Riepilogo prestazioni - STUFF> SUBSTRING> REPLACE
update MetaDataServe set vc = STUFF(vc, 9, 0, '.Client')
(i 2 tempi provengono da più esecuzioni per mostrare la variabilità, è piuttosto basso quindi i tempi possono essere considerati accurati entro il 3%)
update MetaDataServe set vc = REPLACE(vc, '.', '.Client.')
update MetaDataServe set vc = 'MindWorks.Client.' + SUBSTRING(vc, 11, 100)
Numero fisso vs PATINDEX vs CHARINDEX
(La versione a posizione fissa è già data sopra)
Riepilogo delle prestazioni - RISOLTO> (PATINDEX =CHARINDEX)
update MetaDataServe set vc = STUFF(vc, PATINDEX('%.%',vc), 0, '.Client')
update MetaDataServe set vc = STUFF(vc, CHARINDEX('.',vc), 0, '.Client')
Note:
- Tutte le istruzioni di aggiornamento fornite sopra funzioneranno (con una o due modifiche) a seconda delle tue esigenze
- Prima di ogni test, l'intera tabella viene eliminata e ricreata per evitare problemi di memorizzazione nella cache
ATTENZIONE!
Anche se STUFF è più veloce, puoi entrare in situazioni difficili. Se i tuoi dati contengono
"MindWorksNoDot"
E aggiorni usando
update MetaDataServe set vc = STUFF(vc, CHARINDEX('.',vc), 0, '.Client')
Finisci con NULL! Perché quando CHARINDEX non riesce a trovare il punto, il secondo parametro su STUFF pari a zero (0) fa sì che l'intera stringa vada a NULL .
PAROLE FINALI
Per sicurezza e affidabilità, dato che è solo il 33% più lento dell'approccio STUFF, userei semplicemente un'istruzione REPLACE, ad es.
update MetaDataServe set vc = REPLACE(vc, '.', '.Client.')