Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

cách nhanh nhất để cập nhật cột varchar bằng văn bản

Đâ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.')


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tạo truy vấn trong SQL Server 2017

  2. 7645 Vị ngữ toàn văn bản rỗng hoặc trống

  3. Cách thay thế các giá trị (null) bằng đầu ra 0 trong PIVOT

  4. Tôi nên sử dụng kiểu dữ liệu nào để lưu trữ các giá trị tiền tệ?

  5. Chuyển đổi hàng thành cột trong SQL