Giới thiệu
Bài viết hôm nay xuất phát từ một tình huống mà chúng tôi đã trải qua trong thực tế một thời gian trước. Chúng tôi quản lý hệ thống giao dịch thẻ có tên là Postilion và chúng tôi phải cập nhật dữ liệu trong cột chứa địa chỉ IP như một phần của chuỗi với địa chỉ IP mới. Điều này là cần thiết vì địa chỉ IP của máy chủ lưu trữ giải pháp thường sẽ thay đổi do chuyển đổi hoặc khôi phục dữ liệu sang môi trường UAT.
Dữ liệu về máy chủ được lưu trữ trong cơ sở dữ liệu và không có cách nào để cập nhật dữ liệu tương tự từ ứng dụng mà không đi theo từng hàng. Do đó, chúng tôi phải đưa ra một giải pháp hiệu quả bằng cách sử dụng các hàm LEN và SUBSTRING (hoặc REPLACE) của SQL Server.
Tái tạo Môi trường
Đối với phần trình diễn này, chúng tôi chỉ tái tạo bảng được yêu cầu để hiển thị những gì chúng tôi đã làm. Tất nhiên, dữ liệu không giống như trong sản xuất.
Liệt kê 1 trình bày cách chúng tôi tạo và điền vào bảng mẫu của mình:
-- Listing 1: Create and Populate Node_Saps Table
create database postilion;
use postilion
go
-- drop table node_saps
create table node_saps (
[node] varchar(50)
,[sap] varchar(50)
,[type] varchar(50)
,[protocol] varchar(50)
,[address] varchar(50)
,[setup_data] varchar(50)
,[secure] varchar(50)
,[max_nr_conn] varchar(50)
,[msg_mode] varchar(50)
,[nr_active_conns] varchar(50)
,[filter_properties] varchar(50)
)
use postilion
go
insert into node_saps values ('EGH01',2,'sink','TCP','10.2.100.42_atm_ghana', 100,'YES',10,'open',5,'intense');
insert into node_saps values ('EGH02',3,'sink','TCP','10.2.100.42_atm_ghana', 120,'YES',10,'open',5,'moderate');
insert into node_saps values ('ENG01',4,'source','TCP','10.2.100.42_atm_nigeria', 175,'YES',40,'open',19,'premium');
insert into node_saps values ('EBF01',6,'sink','TCP','10.2.100.42_atm_burkina', 122,'YES',20,'open',4,'intense');
insert into node_saps values ('EGQ01',7,'sink','TCP','10.2.100.42_atm_equatorial', 200,'YES',10,'open',2,'moderate');
Bảng này chứa một vài cột đơn giản. Cột quan tâm ở đây là địa chỉ cột. Nhiệm vụ của chúng ta là thay đổi địa chỉ IP từ 10.2.100.42 thành 10.2.100.79.
Như trong Hình 1, dữ liệu được lưu trữ trong cột địa chỉ không phải là địa chỉ IP. Nó là một chuỗi và địa chỉ IP chỉ là một phần của nó. Do đó, chúng tôi không thể thực hiện cập nhật đơn giản. Mỗi hàng có một giá trị khác nhau và chúng ta phải cách ly octet cuối cùng của địa chỉ IP và thực hiện thay đổi ở đó.
Thay thế một phần của chuỗi trong SQL Server bằng hàm SUBSTRING ()
Để đạt được các yêu cầu nhiệm vụ, chúng tôi sử dụng hai hàm đơn giản:hàm LEN () và hàm SUBSTRING (). Chúng tôi sẽ cung cấp ví dụ về SUBSTRING trong SQL Server.
- SQL LEN () hàm trả về số ký tự trong một chuỗi. Điều quan trọng đối với giải pháp của chúng tôi vì dữ liệu ban đầu hơi bẩn - không phải mọi thứ trong cột địa chỉ đều là địa chỉ IP. Do đó, chúng tôi phải đảm bảo cập nhật những gì chúng tôi định cập nhật.
- Máy chủ SQL SUBSTRING () hàm trả về một phần của biểu thức ký tự, nhị phân, văn bản hoặc hình ảnh trong SQL Server. Chúng tôi sử dụng nó để đảm bảo rằng chúng tôi sẽ thay đổi phần chuỗi đó trong cột địa chỉ mà chúng tôi muốn thay đổi - Địa chỉ IP thực tế.
Liệt kê 2 và Hình 2 hiển thị mã để hình dung kết quả của việc thay thế .42 bằng .79 trong cột địa chỉ.
-- Listing 2: Select Statement to Verify Solution
USE postilion
GO
SELECT [node]
,[sap]
,[type]
,[protocol]
,[address]
,substring (address,1,9) + '79' + substring (address,12,20) manrep
,[setup_data]
,[secure]
,[max_nr_conn]
,[msg_mode]
,[nr_active_conns]
,[filter_properties]
FROM [postilion].[dbo].[node_saps]
WHERE len(address) > 10
Lưu ý:Chúng tôi đã tạo một cột được tính toán. Do đó, chúng tôi có thể so sánh các giá trị ban đầu với các thay đổi trước khi áp dụng các thay đổi đó.
Cập nhật một phần của chuỗi trong SQL bằng hàm REPLACE ()
Chúng tôi có thể làm điều này đơn giản hơn bằng cách sử dụng hàm REPLACE (). Nó thay thế tất cả các lần xuất hiện của một giá trị chuỗi được chỉ định bằng một giá trị chuỗi khác.
Hàm REPLACE trả về một chuỗi trong đó nó thay thế một chuỗi con bằng một chuỗi con khác.
Hãy xem đoạn mã trong Liệt kê 3. Chúng tôi nhận được kết quả chính xác giống như trong Hình 2.
-- Listing 3: Select Statement to Verify Solution Using REPLACE()
USE postilion
GO
SELECT [node]
,[sap]
,[type]
,[protocol]
,[address]
,replace(address,'.42','.79') rep
,[setup_data]
,[secure]
,[max_nr_conn]
,[msg_mode]
,[nr_active_conns]
,[filter_properties]
FROM [postilion].[dbo].[node_saps]
WHERE len(address) > 10
Cú pháp cho hàm SUBSTRING trong câu lệnh CẬP NHẬT
Hãy hình dung giải pháp của chúng tôi bằng cách sử dụng câu lệnh SELECT. Chúng ta cần xem chúng ta đã kết hợp hàm LEN () cùng với hàm SUBSTRING () hoặc hàm REPLACE () dễ dàng hơn ở đâu.
Liệt kê 4 trình bày cách chúng tôi thực thi câu lệnh UPDATE. Để đảm bảo an toàn, chúng tôi gửi kèm nó trong một giao dịch. Nếu có gì sai, chúng tôi sẽ có thể khôi phục.
-- Listing 4: UPDATE Statement Using SUBSTRING()
BEGIN TRAN
update [postilion].[dbo].[node_saps]
set address=substring (address,1,9) + '79' + substring (address,12,20)
where substring (address,10,2)= '42' and
len(address) > 10
SELECT * FROM [postilion].[dbo].[node_saps]
--ROLLBACK
--COMMIT
Nếu chúng tôi hài lòng với kết quả, chúng tôi chỉ cần cam kết.
Sử dụng Hàm REPLACE trong câu lệnh CẬP NHẬT
Chúng ta có thể đạt được kết quả tương tự bằng cách sử dụng hàm REPLACE () trong SQL (xem Liệt kê 5). Điều này hoạt động vì dữ liệu cụ thể của chúng tôi, “.42” CHỈ xảy ra MỘT LẦN trong mỗi hàng.
-- Listing 5: UPDATE Statement Using REPLACE()
BEGIN TRAN
update [postilion].[dbo].[node_saps]
set address=replace(address,'.42','.79')
where substring (address,10,2)= '42' and
len(address) > 10
SELECT * FROM [postilion].[dbo].[node_saps]
--ROLLBACK
--COMMIT
Kết luận
Như vậy, chúng tôi đã trình bày cách thay thế một phần của một số chuỗi trong cột bằng cách sử dụng các hàm SUBSTRING và REPLACE. Sự thành công của nhiệm vụ phụ thuộc vào sự hiểu biết đúng đắn về dữ liệu liên quan. Tất nhiên, chúng tôi cần cộng tác với các nhà phát triển và chuyên gia có kinh nghiệm cần thiết để dự đoán hệ quả của bất kỳ lỗi nào trong ứng dụng.
Ngoài ra, chúng tôi đã đề phòng:
- Chúng tôi đã sử dụng câu lệnh SELECT và một cột được tính toán để xác định kết quả cuối cùng trông như thế nào.
- Chúng tôi đã đính kèm tuyên bố UPDATE của mình trong một giao dịch để đảm bảo khôi phục lựa chọn.
Bạn có thể tiến xa hơn trong việc thực hiện các biện pháp phòng ngừa và sao lưu cơ sở dữ liệu:
Tài liệu tham khảo
- Hàm LEN ()
- Hàm SUBSTRING ()
- Chức năng REPLACE