Đây là câu hỏi về "nhanh nhất", vì vậy thời gian được cung cấp bên dưới
Thiết lập thử nghiệm, bảng có> 1 triệu hàng
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 so với Replace so với SubString
Tóm tắt hiệu suất - STUFF> ĐĂNG KÝ> THAY THẾ
update MetaDataServe set vc = STUFF(vc, 9, 0, '.Client')
(2 lần là từ nhiều lần thực hiện để hiển thị sự thay đổi, nó khá thấp nên các lần có thể được coi là chính xác trong khoảng 3%)
update MetaDataServe set vc = REPLACE(vc, '.', '.Client.')
update MetaDataServe set vc = 'MindWorks.Client.' + SUBSTRING(vc, 11, 100)
Số cố định so với PATINDEX so với CHARINDEX
(Phiên bản vị trí cố định đã được cung cấp ở trên)
Tóm tắt Hiệu suất - CỐ ĐỊNH> (PATINDEX =CHARINDEX)
update MetaDataServe set vc = STUFF(vc, PATINDEX('%.%',vc), 0, '.Client')
update MetaDataServe set vc = STUFF(vc, CHARINDEX('.',vc), 0, '.Client')
Ghi chú:
- Tất cả các câu lệnh cập nhật được cung cấp ở trên sẽ hoạt động (với một hoặc hai điều chỉnh) tùy thuộc vào nhu cầu của bạn
- Trước mỗi lần kiểm tra, toàn bộ bảng sẽ được xóa và tạo lại để tránh các sự cố vào bộ nhớ đệm
THẬN TRỌNG!
Mặc dù STUFF nhanh hơn, bạn có thể rơi vào những tình huống khó khăn. Nếu dữ liệu của bạn chứa
"MindWorksNoDot"
Và bạn cập nhật bằng cách sử dụng
update MetaDataServe set vc = STUFF(vc, CHARINDEX('.',vc), 0, '.Client')
Bạn kết thúc với NULL! Bởi vì khi CHARINDEX không thể tìm thấy dấu chấm, tham số thứ hai là STUFF của không (0) khiến toàn bộ chuỗi chuyển đến NULL .
LỜI CUỐI CÙNG
Để đảm bảo an toàn và độ tin cậy, do nó chỉ chậm hơn 33% so với cách tiếp cận STUFF, tôi chỉ cần sử dụng câu lệnh REPLACE, tức là
update MetaDataServe set vc = REPLACE(vc, '.', '.Client.')