Bài viết này trình bày cách sử dụng T-SQL để thay đổi cột hiện có thành cột được tính toán trong SQL Server.
Một cột được tính toán là một cột ảo sử dụng một biểu thức để tính giá trị của nó. Biểu thức thường sẽ sử dụng dữ liệu từ các cột khác. Một cột được tính toán không được lưu trữ vật lý trong bảng trừ khi nó được đánh dấu PERSISTED
.
Ví dụ 1 - Tạo Bảng KHÔNG CÓ Cột Tính toán
Trước tiên, hãy tạo một bảng không có một cột được tính toán.
TẠO BẢNG Person (PersonID int IDENTITY (1,1) NOT NULL, FirstName varchar (70), LastName varchar (70), FullName varchar (140)); INSERT INTO Person (FirstName, LastName, FullName) VALUES (' Homer ',' Seinfeld ',' Homer Seinfeld '), (' Bart ',' Costanza ',' Bart Costanza '), (' Marge ',' Kramer ',' Marge Kramer '); CHỌN * TỪ NGƯỜI;Kết quả:
+ ------------ + ------------- + ------------ + ------ ---------- + | ID người | FirstName | LastName | FullName || ------------ + ------------- + ------------ + ------- --------- || 1 | Homer | Seinfeld | Homer Seinfeld || 2 | Bart | Costanza | Bart Costanza || 3 | Marge | Kramer | Marge Kramer | + ------------ + ------------- + ------------ + ------ ---------- +Bạn có thể thấy rằng tôi đang tăng gấp đôi khi tôi chèn dữ liệu. Tên đầy đủ là sự kết hợp của tên và họ và tôi đang nhập lại dữ liệu này cho mọi hàng.
Điều này cũng có thể gây ra sự cố khi cập nhật bảng. Tôi cần nhớ cập nhật hai cột bất cứ khi nào ai đó thay đổi tên họ hoặc tên thứ hai (và ba cột nếu họ đã thay đổi cả hai).
Đây là một ứng cử viên tốt cho một cột được tính toán.
Ví dụ 2 - Thay đổi Cột thành Cột được Tính toán
Để thay đổi một cột thành một cột được tính toán, trước tiên bạn cần thả cột đó xuống, sau đó tạo nó với định nghĩa mới.
Đây là cách thay đổi
FullName
thành một cột được tính toán.ALTER TABLE Person DROP COLUMN FullName; ALTER TABLE Person ADD FullName AS (CONCAT (FirstName, '', LastName));Chúng tôi vừa “thay đổi” cột có tên là
FullName
vào một cột được tính toán. Nó nốiFirstName
vàLastName
cột.Đây là những gì sẽ xảy ra khi chúng tôi chọn nội dung của bảng:
CHỌN * TỪ NGƯỜI;Kết quả:
+ ------------ + ------------- + ------------ + ------ ---------- + | ID người | FirstName | LastName | FullName || ------------ + ------------- + ------------ + ------- --------- || 1 | Homer | Seinfeld | Homer Seinfeld || 2 | Bart | Costanza | Bart Costanza || 3 | Marge | Kramer | Marge Kramer | + ------------ + ------------- + ------------ + ------ ---------- +Ví dụ 3 - Cập nhật giá trị
Bây giờ, nếu một giá trị được cập nhật trong
FirstName
hoặcLastName
, điều này sẽ ảnh hưởng đến giá trị được trả về bởi cột được tính toán. Không cần cập nhật nó trong hai cột.Ví dụ:
CẬP NHẬT PersonSET LastName ='Bourne'WHERE PersonId =3; CHỌN * TỪ NGƯỜI;Kết quả:
+ ------------ + ------------- + ------------ + ------ ---------- + | ID người | FirstName | LastName | FullName || ------------ + ------------- + ------------ + ------- --------- || 1 | Homer | Seinfeld | Homer Seinfeld || 2 | Bart | Costanza | Bart Costanza || 3 | Marge | Bourne | Marge Bourne | + ------------ + ------------- + ------------ + ------ ---------- +