Dit is een vraag over 'snelst', dus de tijden staan hieronder
Testopstelling, tabel met>1 miljoen rijen
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
Prestatiesamenvatting - STUFF> SUBSTRING> VERVANGEN
update MetaDataServe set vc = STUFF(vc, 9, 0, '.Client')
(de 2 tijden zijn van meerdere uitvoeringen om de variabiliteit te laten zien, het is vrij laag, dus de tijden kunnen als nauwkeurig worden beschouwd tot op 3%)
update MetaDataServe set vc = REPLACE(vc, '.', '.Client.')
update MetaDataServe set vc = 'MindWorks.Client.' + SUBSTRING(vc, 11, 100)
Vast nummer vs PATINDEX vs CHARINDEX
(De versie met vaste positie is hierboven al gegeven)
Prestatiesamenvatting - OPGELOST> (PATINDEX =CHARINDEX)
update MetaDataServe set vc = STUFF(vc, PATINDEX('%.%',vc), 0, '.Client')
update MetaDataServe set vc = STUFF(vc, CHARINDEX('.',vc), 0, '.Client')
Opmerkingen:
- Alle bovenstaande update-instructies werken (met een of twee aanpassingen) afhankelijk van uw behoeften
- Vóór elke test wordt de hele tabel verwijderd en opnieuw gemaakt om cacheproblemen te voorkomen
LET OP!
Ook al is STUFF sneller, je kunt in lastige situaties terechtkomen. Als uw gegevens
"MindWorksNoDot"
En je update met
update MetaDataServe set vc = STUFF(vc, CHARINDEX('.',vc), 0, '.Client')
Je eindigt met NULL! Omdat wanneer CHARINDEX de punt niet kan vinden, de tweede parameter van STUFF van nul (0) ervoor zorgt dat de hele string naar NULL gaat .
SLOTWOORDEN
Voor veiligheid en betrouwbaarheid, aangezien het slechts 33% langzamer is dan de STUFF-aanpak, zou ik gewoon een REPLACE-statement gebruiken, d.w.z.
update MetaDataServe set vc = REPLACE(vc, '.', '.Client.')