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

Đổi tên bảng 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 một bảng.

Hầu hết các RDBM chính khác cho phép bạn đổi tên bảng bằng ALTER TABLE nhưng đây không phải là trường hợp của SQL Server.

Ví dụ

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

EXEC sp_rename 't1', 't2';

Điều này đổi tên bảng được gọi là t1 thành t2 .

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

Bạn cũng có thể đủ điều kiện cho bảng đầ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', 't2';

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',
    @newname = 't2';

sp_rename thủ tục cũng chấp nhận một @objtype nhưng điều này không bắt buộc (hoặc được hỗ trợ) khi đổi tên bảng.

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

Khi bạn đổi tên một bảng 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 bảng, SQL Server không tự động đổi tên bất kỳ tham chiếu nào đến bảng đó. Điều này cũng đúng khi bạn đổi tên một cột.

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

Do đó, trước khi đổi tên bất kỳ bảng 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 bảng đó. 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 bảng 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.

Ví dụ:

SELECT OBJECT_NAME(referencing_id) AS [Referencing Entity],   
    o.type_desc AS [Type],   
    COALESCE(COL_NAME(referencing_id, referencing_minor_id), '(n/a)') AS [Column],
    referenced_entity_name AS [Referenced Entity],   
    COALESCE(COL_NAME(referenced_id, referenced_minor_id), '(n/a)') AS [Column]
FROM sys.sql_expression_dependencies AS sed  
INNER JOIN sys.objects AS o ON sed.referencing_id = o.object_id  
WHERE referenced_id = OBJECT_ID(N't1');

Trong trường hợp này, tôi đã kết hợp nó với sys.objects để trả lại thêm thông tin.

Đây là kết quả tôi nhận được trước khi thay đổi tên của t1 bảng:

+----------------------+----------------------+----------+---------------------+----------+
 | Referencing Entity   | Type                 | Column   | Referenced Entity   | Column   |
 |----------------------+----------------------+----------+---------------------+----------|
 | usp_t1               | SQL_STORED_PROCEDURE | (n/a)    | t1                  | (n/a)    |
 | vt1                  | VIEW                 | (n/a)    | t1                  | (n/a)    |
 | t1                   | USER_TABLE           | c2       | t1                  | c1       |
 +----------------------+----------------------+----------+---------------------+----------+ 

Điều này cho tôi thấy rằng có một chế độ xem, một quy trình được lưu trữ và một cột được tính toán phụ thuộc vào t1 bàn. Cột được tính (c2 ) tham chiếu đến c1 trong cùng một bảng.

Như đã đề cập, điều quan trọng là phải chạy kiểm tra này trước khi bạn thay đổi tên của bảng. Đây là kết quả tôi nhận được khi chạy cùng một tập lệnh sau khi thay đổi tên của bảng.

SELECT OBJECT_NAME(referencing_id) AS [Referencing Entity],   
    o.type_desc AS [Type],   
    COALESCE(COL_NAME(referencing_id, referencing_minor_id), '(n/a)') AS [Column],
    referenced_entity_name AS [Referenced Entity],   
    COALESCE(COL_NAME(referenced_id, referenced_minor_id), '(n/a)') AS [Column]
FROM sys.sql_expression_dependencies AS sed  
INNER JOIN sys.objects AS o ON sed.referencing_id = o.object_id  
WHERE referenced_id = OBJECT_ID(N't1');

Kết quả:

(0 rows affected) 

Trong trường hợp này, tôi đã sử dụng tên gốc của bảng (t1 ), vì vậy, rõ ràng là chúng tôi thậm chí đã không nhắm mục tiêu đúng bảng (t2 ).

Chỉ cần thay đổi tập lệnh này để tham chiếu đến tên bảng mới cũng sẽ không hoạt động. Ví dụ:chạy tập lệnh sau sau khi chúng tôi đã thay đổi tên của bảng từ t1 thành t2 chỉ trả về một phần phụ thuộc (cột được tính toán).

SELECT OBJECT_NAME(referencing_id) AS [Referencing Entity],   
    o.type_desc AS [Type],   
    COALESCE(COL_NAME(referencing_id, referencing_minor_id), '(n/a)') AS [Column],
    referenced_entity_name AS [Referenced Entity],   
    COALESCE(COL_NAME(referenced_id, referenced_minor_id), '(n/a)') AS [Column]
FROM sys.sql_expression_dependencies AS sed  
INNER JOIN sys.objects AS o ON sed.referencing_id = o.object_id  
WHERE referenced_id = OBJECT_ID(N't2');

Kết quả:

+----------------------+------------+----------+---------------------+----------+
 | Referencing Entity   | Type       | Column   | Referenced Entity   | Column   |
 |----------------------+------------+----------+---------------------+----------|
 | t2                   | USER_TABLE | c2       | t2                  | c1       |
 +----------------------+------------+----------+---------------------+----------+ 

Tin tốt là cột đã tính được trả về. Tin xấu là chế độ xem và thủ tục đã lưu trữ không được trả lại.

Điểm mấu chốt:Kiểm tra các phần phụ thuộc trước khi bạn đổi tên bảng. Sau đó, cập nhật thủ công bất kỳ đối tượng nào tham chiếu đến bảng đã đổ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. Làm cách nào để chuyển giá trị cho một tham số thủ tục được lưu trữ trong thành phần Nguồn OLE DB?

  2. Làm cách nào để chỉ định số cổng trong chuỗi kết nối SQL Server?

  3. Không bằng toán tử <>! =Trên NULL

  4. Phương pháp tốt nhất để truyền các tham số cho SQLCommand là gì?

  5. Làm thế nào để sử dụng một biến cho tên cơ sở dữ liệu trong T-SQL?