Det här är en fråga om "snabbast", så tider anges nedan
Testinställningar, tabell med>1 miljon rader
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)
Stuff vs Replace vs SubString
Sammanfattning av prestanda - STUFF> SUBSTRING> ERSÄTT
update MetaDataServe set vc = STUFF(vc, 9, 0, '.Client')
(de två gångerna är från flera körningar för att visa variabiliteten, den är ganska låg så tiderna kan anses vara korrekta inom 3%)
update MetaDataServe set vc = REPLACE(vc, '.', '.Client.')
update MetaDataServe set vc = 'MindWorks.Client.' + SUBSTRING(vc, 11, 100)
Fast nummer vs PATINDEX vs CHARINDEX
(Versionen med fast position finns redan ovan)
Prestandasammanfattning - FIXED> (PATINDEX =CHARINDEX)
update MetaDataServe set vc = STUFF(vc, PATINDEX('%.%',vc), 0, '.Client')
update MetaDataServe set vc = STUFF(vc, CHARINDEX('.',vc), 0, '.Client')
Anmärkningar:
- Alla uppdateringssatser ovan kommer att fungera (med en justering eller två) beroende på dina behov
- Innan varje test släpps hela tabellen och återskapas för att förhindra cacheproblem
VARNING!
Även om STUFF är snabbare kan du hamna i knepiga situationer. Om dina uppgifter innehåller
"MindWorksNoDot"
Och du uppdaterar med
update MetaDataServe set vc = STUFF(vc, CHARINDEX('.',vc), 0, '.Client')
Du slutar med NULL! För när CHARINDEX inte kan hitta punkten, gör den andra parametern till STUFF på noll (0) att hela strängen går till NULL .
SLUTLIGA ORD
För säkerhet och tillförlitlighet, eftersom det bara är 33 % långsammare än STUFF-metoden, skulle jag helt enkelt använda en REPLACE-sats, dvs.
update MetaDataServe set vc = REPLACE(vc, '.', '.Client.')