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

Đổi tên một cột trong SQL Server (T-SQL)

Trong SQL Server, bạn có thể sử dụng sp_rename thủ tục được lưu trữ để đổi tên một đối tượng, bao gồm cả một cột.

Ví dụ

Dưới đây là một ví dụ để chứng minh:

EXEC sp_rename 't1.c1', 'c11';

Thao tác này đổi tên cột có tên là c1 (trong t1 bảng) thành c11 .

Bao gồm loại đối tượng

Bạn cũng có thể bao gồm kiểu đối tượng làm đối số thứ ba. Trong trường hợp này, chúng ta có thể sử dụng COLUMN :

EXEC sp_rename 'dbo.t1.c11', 'c1', 'COLUMN';

Bao gồm Tên lược đồ

Bạn cũng có thể đủ điều kiện cho cột đầu tiên có tên giản đồ, trong trường hợp đó, nó có thể trông giống như sau:

EXEC sp_rename 'dbo.t1.c1', 'c11', 'COLUMN';

Trong ví dụ này, dbo là tên giản đồ, nhưng bạn sẽ cần sử dụng bất kỳ lược đồ nào có thể áp dụng được.

Bao gồm Tên tham số

Như với bất kỳ thủ tục được lưu trữ nào, bạn cũng có thể bao gồm tên tham số khi gọi sp_rename :

EXEC sp_rename 
    @objname = 'dbo.t1.c1',
    @newname = 'c11',
    @objtype = 'COLUMN';

Kiểm tra tài liệu tham khảo

Khi bạn đổi tên một cột trong SQL Server, bạn có thể sẽ thấy một thông báo như sau:

Caution: Changing any part of an object name could break scripts and stored procedures.

Điều này là do khi bạn đổi tên một cột, SQL Server không tự động đổi tên bất kỳ tham chiếu nào đến cột đó. Điều này cũng đúng khi bạn đổi tên bảng.

Bất chấp thông báo cảnh báo ở trên, cột vẫn được đổi tên.

Nếu chúng tôi cố gắng truy vấn một dạng xem tham chiếu đến cột đã được đổi tên, chúng tôi sẽ gặp lỗi.

SELECT * FROM vt1;

Kết quả:

Msg 207, Level 16, State 1, Procedure vt1, Line 2
Invalid column name 'c1'.
Msg 4413, Level 16, State 1, Line 1
Could not use view or function 'vt1' because of binding errors.

Chế độ xem này đang cố gắng tham chiếu c1 nhưng cột đó đã được đổi tên, và do đó không có cột nào có tên đó trong bảng.

Định nghĩa của chế độ xem này trông giống như sau:

CREATE VIEW vt1 AS
SELECT c1, c2 FROM dbo.t1;

Chúng tôi cần cập nhật chế độ xem này để tham chiếu đến tên cột mới. Vì vậy, chúng tôi có thể làm điều này:

ALTER VIEW vt1 AS
SELECT c11, c2 FROM dbo.t1;

Bây giờ truy vấn chế độ xem sẽ trả về dữ liệu chính xác.

Do đó, trước khi đổi tên bất kỳ cột nào, bạn phải luôn kiểm tra các tập lệnh và thủ tục được lưu trữ tham chiếu đến cột đó. Bạn sẽ cần cập nhật các tập lệnh và thủ tục như vậy để tham chiếu đến tên cột mới.

Bạn có thể sử dụng sys.sql_expression_dependencies chế độ xem danh mục hệ thống để thực hiện việc kiểm tra này.

Đổi tên các cột được tính

SQL Server không cho phép chúng tôi đổi tên các cột đã tính.

Nếu bạn cố gắng đổi tên một cột được tính toán, bạn có thể sẽ thấy thông báo lỗi sau.

EXEC sp_rename 'dbo.t1.c3', 'c13', 'COLUMN';

Kết quả:

Caution: Changing any part of an object name could break scripts and stored procedures.
Msg 4928, Level 16, State 1, Procedure sp_rename, Line 689
Cannot alter column 'c3' because it is 'COMPUTED'.

Trong trường hợp này, c3 là một cột được tính toán thực hiện phép tính dựa trên một giá trị trong c2 cột.

Đây là những gì sẽ xảy ra khi chúng tôi cố gắng đổi tên c2 cột.

EXEC sp_rename 'dbo.t1.c2', 'c12', 'COLUMN';

Kết quả:

Không thể đổi tên
Msg 15336, Level 16, State 1, Procedure sp_rename, Line 563
Object 'dbo.t1.c2' cannot be renamed because the object participates in enforced dependencies.

Chúng tôi nhận được một lỗi khác cho cột này. Lỗi này là do cột được tính phụ thuộc vào cột này.

Về cơ bản, để đổi tên cột đã tính, chúng ta cần bỏ nó và thêm lại.

Ví dụ:

ALTER TABLE t1
DROP COLUMN c3;

ALTER TABLE t1
ADD c13 AS c2 * 10;

Phím ngoại

Đổi tên cột khóa chính không phá vỡ bất kỳ khóa ngoại nào tham chiếu đến cột đó.

Ví dụ:trước khi tôi đổi tên t1.c1 thành t1.c11 , mặc dù tôi không đề cập đến nó, tôi thực sự có một bảng và cột khác (t2.c2 ) đã tham chiếu đến t1.c1 .

Sau khi đổi tên t1.c1 thành t1.c11 , ràng buộc khóa ngoại trên t2.c2 vẫn đang thực thi bất kỳ chèn mới nào để tuân thủ khóa ngoại, mặc dù cột khóa chính trong bảng khác đã được thay đổi tên.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Thiết kế cơ sở dữ liệu cho cài đặt người dùng

  2. Có một SQL Server Profiler cho SQL Server Express không?

  3. Danh sách các hàm ngày và giờ trong SQL Server (T-SQL)

  4. Giới thiệu về bảng tạm thời trong SQL Server

  5. Cách lọc các đối tượng trong SQL Server Management Studio (SSMS) - Hướng dẫn SQL Server / TSQL Phần 19