To jest pytanie o „najszybszy”, więc czasy są podane poniżej
Konfiguracja testowa, tabela z>1 milionem wierszy
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)
Rzeczy vs Zastąp vs Podciąg
Podsumowanie skuteczności — STUFF> SUBSTRING> REPLACE
update MetaDataServe set vc = STUFF(vc, 9, 0, '.Client')
(dwa czasy pochodzą z wielu wykonań, aby pokazać zmienność, jest dość niski, więc czasy można uznać za dokładne z dokładnością do 3%)
update MetaDataServe set vc = REPLACE(vc, '.', '.Client.')
update MetaDataServe set vc = 'MindWorks.Client.' + SUBSTRING(vc, 11, 100)
Stała liczba vs PATINDEX vs CHARINDEX
(Wersja z ustaloną pozycją jest już podana powyżej)
Podsumowanie wydajności — STAŁE> (PATINDEX =CHARINDEX)
update MetaDataServe set vc = STUFF(vc, PATINDEX('%.%',vc), 0, '.Client')
update MetaDataServe set vc = STUFF(vc, CHARINDEX('.',vc), 0, '.Client')
Uwagi:
- Wszystkie powyższe instrukcje dotyczące aktualizacji będą działać (z poprawką lub dwoma) w zależności od Twoich potrzeb
- Przed każdym testem cała tabela jest usuwana i ponownie tworzona, aby zapobiec problemom z buforowaniem
UWAGA!
Mimo że STUFF jest szybszy, możesz znaleźć się w trudnych sytuacjach. Jeśli Twoje dane zawierają
"MindWorksNoDot"
A aktualizujesz za pomocą
update MetaDataServe set vc = STUFF(vc, CHARINDEX('.',vc), 0, '.Client')
Skończysz z NULL! Ponieważ gdy CHARINDEX nie może znaleźć kropki, drugi parametr do STUFF równy zero (0) powoduje, że cały ciąg przechodzi do NULL .
KOŃCOWE SŁOWA
Ze względu na bezpieczeństwo i niezawodność, biorąc pod uwagę, że jest tylko o 33% wolniejsze niż podejście STUFF, użyłbym po prostu wyrażenia REPLACE, tj.
update MetaDataServe set vc = REPLACE(vc, '.', '.Client.')