Това е въпрос за „най-бърз“, така че времената са дадени по-долу
Настройка на теста, таблица с>1 милион реда
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)
Неща срещу Замяна срещу Подниз
Обобщение на производителността - НЕЩА> ПОДНИЗ> ЗАМЕНИТЕ
update MetaDataServe set vc = STUFF(vc, 9, 0, '.Client')
(2-те времена са от множество изпълнения, за да се покаже променливостта, тя е доста ниска, така че времената могат да се считат за точни до 3%)
update MetaDataServe set vc = REPLACE(vc, '.', '.Client.')
update MetaDataServe set vc = 'MindWorks.Client.' + SUBSTRING(vc, 11, 100)
Фиксиран номер срещу PATINDEX срещу CHARINDEX
(Версията с фиксирана позиция вече е дадена по-горе)
Резюме на производителността - ФИКСИРАН> (PATINDEX =CHARINDEX)
update MetaDataServe set vc = STUFF(vc, PATINDEX('%.%',vc), 0, '.Client')
update MetaDataServe set vc = STUFF(vc, CHARINDEX('.',vc), 0, '.Client')
Бележки:
- Всички инструкции за актуализиране, дадени по-горе, ще работят (с една или две настройки) в зависимост от вашите нужди
- Преди всеки тест цялата таблица се премахва и се създава отново, за да се предотвратят проблеми с кеширането
ВНИМАНИЕ!
Въпреки че STUFF е по-бърз, можете да попаднете в трудни ситуации. Ако вашите данни съдържат
"MindWorksNoDot"
И актуализирате с помощта на
update MetaDataServe set vc = STUFF(vc, CHARINDEX('.',vc), 0, '.Client')
Завършвате с NULL! Тъй като когато CHARINDEX не може да намери точката, вторият параметър на STUFF от нула (0) кара целия низ да премине към NULL .
ЗАКЛЮЧИТЕЛНИ ДУМИ
За безопасност и надеждност, като се има предвид, че е само с 33% по-бавен от подхода STUFF, бих използвал просто оператор REPLACE, т.е.
update MetaDataServe set vc = REPLACE(vc, '.', '.Client.')