Làm cách nào để đổi tên bảng trong SQL Server?


370

Các SQLtruy vấn mà tôi đã sử dụng là:

ALTER TABLE oldtable RENAME TO newtable;

Nhưng, nó cho tôi một lỗi.

Máy chủ: Msg 156, Cấp 15, Trạng thái 1, Dòng 1
Cú pháp không chính xác gần từ khóa 'TO'.

Câu trả lời:


683

Để đổi tên bảng trong SQL Server, hãy sử dụng sp_renamelệnh:

exec sp_rename 'schema.old_table_name', 'new_table_name'

7
Một điều nữa: nếu bất kỳ tên bảng nào có .trong đó, hãy sử dụng []xung quanh tên bảng. (Tôi biết, tôi biết, nhưng các dấu chấm có thể xảy ra ...) Ví dụ sp_rename '[Stupid.name]', 'NewName'hoặc với lược đồsp_rename '[dbo.Stupid.name]', 'NewName'
vacip

55
Và để thêm, đừng vô tình đặt lược đồ vào 'NewName'trường, nếu không bảng của bạn có thể trông giống như vậy dbo.dbo.NewName.
Michael Plautz

4
Hãy nhớ rằng khi đổi tên bảng, bạn gần như chắc chắn cũng muốn đổi tên bất kỳ tham chiếu nào đến bảng đó có thể tồn tại trong các thủ tục, chế độ xem, chức năng được lưu trữ, v.v. Google nhanh chóng có thể tìm thấy một trong nhiều công cụ có thể làm điều này cho bạn . Hoặc bạn có thể sử dụng tập lệnh tìm một chuỗi đã cho trong tất cả các đối tượng này và dán chúng dưới dạng câu lệnh ALTER và thực hiện tìm và thay thế, sau đó chạy tất cả.
MGOwen

2
Bạn cũng có thể tạo một từ đồng nghĩa được đặt tên theo tên bảng cũ chỉ vào bảng mớiCREATE SYNONYM [schema].[synonymName] FOR [schema].[tableName]
Ruskin

không đặt tên mới trong ngoặc vuông! nếu không, bảng sẽ có dấu ngoặc vuông IN tên. Vì vậy: 'new_table_name' - là chính xác, '[new_table_name]' - sẽ khiến bạn gặp rắc rối
VeganHunter

143

Để đổi tên một cột:

sp_rename 'table_name.old_column_name', 'new_column_name' , 'COLUMN';

Để đổi tên bảng:

sp_rename 'old_table_name','new_table_name';

Không giải thích cách xử lý các lược đồ khác ngoài dbo mặc định.
Sal

1
@Sal Không ít hơn bất kỳ câu trả lời khác ở đây? Bạn có đang tìm cách thay đổi lược đồ của bảng không?
Bacon Bits

14

Khi sử dụng sp_rename hoạt động như trong các câu trả lời ở trên, hãy kiểm tra xem các đối tượng nào bị ảnh hưởng sau khi đổi tên, tham chiếu bảng đó, bởi vì bạn cũng cần thay đổi những đối tượng đó

Tôi lấy một ví dụ mã cho các phụ thuộc bảng tại blog của Pinal Dave tại đây

USE AdventureWorks
GO
SELECT
referencing_schema_name = SCHEMA_NAME(o.SCHEMA_ID),
referencing_object_name = o.name,
referencing_object_type_desc = o.type_desc,
referenced_schema_name,
referenced_object_name = referenced_entity_name,
referenced_object_type_desc = o1.type_desc,
referenced_server_name, referenced_database_name
--,sed.* -- Uncomment for all the columns
FROM
sys.sql_expression_dependencies sed
INNER JOIN
sys.objects o ON sed.referencing_id = o.[object_id]
LEFT OUTER JOIN
sys.objects o1 ON sed.referenced_id = o1.[object_id]
WHERE
referenced_entity_name = 'Customer'

Vì vậy, tất cả các đối tượng phụ thuộc này cũng cần được cập nhật

Hoặc sử dụng một số bổ trợ nếu bạn có thể, một số trong số chúng có tính năng đổi tên đối tượng và tất cả các đối tượng phụ thuộc, cũng vậy


11

Nếu bạn thử exec sp_renamevà nhận được lỗi LockMatchID thì trước tiên có thể giúp thêm câu lệnh sử dụng [cơ sở dữ liệu]:

Tôi đã thử

 exec sp_rename '[database_name].[dbo].[table_name]', 'new_table_name';
 -- Invalid EXECUTE statement using object "Object", method "LockMatchID".

Những gì tôi phải làm để sửa nó là viết lại thành:

use database_name
exec sp_rename '[dbo].[table_name]', 'new_table_name';

10

Tên bảng

sp_rename 'db_name.old_table_name', 'new_table_name'

Cột

sp_rename 'db_name.old_table_name.name' 'userName', 'COLUMN'

Mục lục

sp_rename 'db_name.old_table_name.id', 'product_ID', 'INDEX'

cũng có sẵn cho statics và datatypes


2
Đối với Cột bạn đang thiếu dấu phẩy giữa các tham số thứ nhất và thứ hai. Nó phải là: sp_rename 'db_name.old_table_name.name', 'userName', 'COLUMN'
sebastian.roibu


0

Không có gì làm việc từ đề xuất ở đây .. Vì vậy, chỉ cần đưa dữ liệu vào bảng mới

SELECT * 
INTO [acecodetable].['PSCLineReason']
FROM [acecodetable].['15_PSCLineReason'];

có lẽ sẽ hữu ích cho ai đó ..

Trong trường hợp của tôi, nó không nhận ra lược đồ mới, dbo cũng là chủ sở hữu ..

CẬP NHẬT

EXECUTE sp_rename N'[acecodetable].[''TradeAgreementClaim'']', N'TradeAgreementClaim';

Đã làm cho tôi. Tôi tìm thấy nó từ tập lệnh được tạo tự động khi cập nhật PK cho một trong các bảng. Bằng cách này, nó cũng nhận ra lược đồ mới ..


0

Để thay đổi tên bảng bằng một lược đồ khác:

Ví dụ: Thay đổi dbo.MyTable1 thành wrk.MyTable2

EXEC SP_RENAME 'dbo.MyTable1', 'MyTable2'

ALTER SCHEMA wrk TRANSFER dbo.MyTable2
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.