Ini adalah pertanyaan tentang "tercepat", jadi waktunya disediakan di bawah
Pengaturan pengujian, tabel dengan>1 juta baris
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)
Barang vs Ganti vs SubString
Ringkasan Kinerja - STUFF> SUBSTRING> GANTI
update MetaDataServe set vc = STUFF(vc, 9, 0, '.Client')
(2 kali dari beberapa eksekusi untuk menunjukkan variabilitas, cukup rendah sehingga waktu dapat dianggap akurat dalam 3%)
update MetaDataServe set vc = REPLACE(vc, '.', '.Client.')
update MetaDataServe set vc = 'MindWorks.Client.' + SUBSTRING(vc, 11, 100)
Nomor tetap vs PATINDEX vs CHARINDEX
(Versi posisi tetap sudah diberikan di atas)
Ringkasan Kinerja - TETAP> (PATINDEX =CHARINDEX)
update MetaDataServe set vc = STUFF(vc, PATINDEX('%.%',vc), 0, '.Client')
update MetaDataServe set vc = STUFF(vc, CHARINDEX('.',vc), 0, '.Client')
Catatan:
- Semua pernyataan pembaruan yang diberikan di atas akan berfungsi (dengan satu atau dua penyesuaian) tergantung pada kebutuhan Anda
- Sebelum setiap pengujian, seluruh tabel dihapus dan dibuat ulang untuk mencegah masalah cache
PERHATIAN !
Meskipun STUFF lebih cepat, Anda bisa masuk ke situasi sulit. Jika data Anda berisi
"MindWorksNoDot"
Dan Anda memperbarui menggunakan
update MetaDataServe set vc = STUFF(vc, CHARINDEX('.',vc), 0, '.Client')
Anda berakhir dengan NULL! Karena ketika CHARINDEX tidak dapat menemukan titik, parameter kedua ke STUFF nol (0) menyebabkan seluruh string menjadi NULL .
KATA AKHIR
Untuk keamanan dan keandalan, mengingat hanya 33% lebih lambat daripada pendekatan STUFF, saya hanya akan menggunakan pernyataan REPLACE, yaitu
update MetaDataServe set vc = REPLACE(vc, '.', '.Client.')