Toto je otázka „nejrychlejší“, takže časování je uvedeno níže
Nastavení testu, tabulka s>1 milionem řádků
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)
Věci vs. Nahradit vs Podřetězec
Shrnutí výkonu – STUFF> SUBSTRING> REPLACE
update MetaDataServe set vc = STUFF(vc, 9, 0, '.Client')
(dva časy jsou z vícenásobných provedení, aby se ukázala variabilita, je poměrně nízká, takže časy lze považovat za přesné s přesností 3 %)
update MetaDataServe set vc = REPLACE(vc, '.', '.Client.')
update MetaDataServe set vc = 'MindWorks.Client.' + SUBSTRING(vc, 11, 100)
Pevné číslo vs PATINDEX vs CHARINDEX
(Verze s pevnou pozicí je již uvedena výše)
Přehled výkonu – OPRAVENO> (PATINDEX =CHARINDEX)
update MetaDataServe set vc = STUFF(vc, PATINDEX('%.%',vc), 0, '.Client')
update MetaDataServe set vc = STUFF(vc, CHARINDEX('.',vc), 0, '.Client')
Poznámky:
- Všechna výše uvedená prohlášení o aktualizaci budou fungovat (s jedním nebo dvěma úpravami) v závislosti na vašich potřebách
- Před každým testem je celá tabulka odstraněna a znovu vytvořena, aby se předešlo problémům s mezipamětí.
POZOR!
I když je STUFF rychlejší, můžete se dostat do ošemetných situací. Pokud vaše data obsahují
"MindWorksNoDot"
A aktualizujete pomocí
update MetaDataServe set vc = STUFF(vc, CHARINDEX('.',vc), 0, '.Client')
Skončíte s NULL! Protože když CHARINDEX nemůže najít tečku, druhý parametr STUFF nula (0) způsobí, že celý řetězec přejde na NULL .
ZÁVĚREČNÁ SLOVA
Kvůli bezpečnosti a spolehlivosti, protože je pouze o 33 % pomalejší než přístup STUFF, bych jednoduše použil příkaz REPLACE, tj.
update MetaDataServe set vc = REPLACE(vc, '.', '.Client.')