Il s'agit d'une question sur "le plus rapide", donc les horaires sont fournis ci-dessous
Configuration du test, tableau avec>1 million de lignes
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)
Éléments vs Remplacer vs SubString
Résumé des performances – STUFF > SUBSTRING > REPLACE
update MetaDataServe set vc = STUFF(vc, 9, 0, '.Client')
(les 2 temps proviennent de plusieurs exécutions pour montrer la variabilité, il est assez faible donc les temps peuvent être considérés comme précis à moins de 3%)
update MetaDataServe set vc = REPLACE(vc, '.', '.Client.')
update MetaDataServe set vc = 'MindWorks.Client.' + SUBSTRING(vc, 11, 100)
Nombre fixe vs PATINDEX vs CHARINDEX
(La version à position fixe est déjà donnée ci-dessus)
Résumé des performances - FIXE> (PATINDEX =CHARINDEX)
update MetaDataServe set vc = STUFF(vc, PATINDEX('%.%',vc), 0, '.Client')
update MetaDataServe set vc = STUFF(vc, CHARINDEX('.',vc), 0, '.Client')
Remarques :
- Toutes les déclarations de mise à jour données ci-dessus fonctionneront (avec un ou deux ajustements) en fonction de vos besoins
- Avant chaque test, la table entière est supprimée et recréée pour éviter les problèmes de mise en cache
ATTENTION !
Même si STUFF est plus rapide, vous pouvez vous retrouver dans des situations délicates. Si vos données contiennent
"MindWorksNoDot"
Et vous mettez à jour en utilisant
update MetaDataServe set vc = STUFF(vc, CHARINDEX('.',vc), 0, '.Client')
Vous vous retrouvez avec NULL ! Parce que lorsque CHARINDEX ne peut pas trouver le point, le deuxième paramètre de STUFF de zéro (0) fait passer la chaîne entière à NULL .
DERNIERES MOTS
Pour des raisons de sécurité et de fiabilité, étant donné qu'elle n'est que 33 % plus lente que l'approche STUFF, j'utiliserais simplement une instruction REPLACE, c'est-à-dire
update MetaDataServe set vc = REPLACE(vc, '.', '.Client.')