Đổi tên cột SQL Server 2008


652

Tôi đang sử dụng SQL Server 2008 và Navicat. Tôi cần đổi tên một cột trong bảng bằng SQL.

ALTER TABLE table_name RENAME COLUMN old_name to new_name;

Tuyên bố này không hoạt động.



5
Lưu ý rằng đây không hoàn toàn là một bản sao của câu hỏi # 174582 mà swetha đã liên kết: câu hỏi này đặc trưng cho MS SQL, câu hỏi này không liên quan đến cơ sở dữ liệu.

Câu trả lời:


1193

Sử dụng sp_rename

EXEC sp_RENAME 'TableName.OldColumnName' , 'NewColumnName', 'COLUMN'

Xem: SQL SERVER - Cách đổi tên tên cột hoặc tên bảng

Tài liệu: sp_rename (Transact-SQL)

Đối với trường hợp của bạn, nó sẽ là:

EXEC sp_RENAME 'table_name.old_name', 'new_name', 'COLUMN'

Hãy nhớ sử dụng dấu ngoặc đơn để đính kèm các giá trị của bạn.


24
Lưu ý rằng bạn không nên đặt NewColumnName trong ngoặc, vì SQL Server sau đó sẽ sử dụng [[[NewColumnName]]] làm tên của cột mới. Ngoài ra, sp_rename nên được tiền tố bởi EXEC hoặc EXECUTE.
Đánh dấu Freeman

29
Bạn được phép và khuyến khích đặt dấu ngoặc trong tham số đầu tiên, xác định cột, nhưng không phải trong tham số thứ hai. Như thế này:EXEC sp_RENAME '[TableName].[OldColumnName]', 'NewColumnName', 'COLUMN'
Niels Brinch

2
Bạn nên lưu ý trong câu trả lời của bạn rằng thủ tục xử lý các giá trị mặc định được lưu trữ này, null vv contraints trong khi làm việc đổi tên, như trái ngược với một đồng bằng alter tablemà sẽ thất bại nếu những hạn chế như vậy tồn tại.
Tuncay Göncüoğlu

4
Lưu ý rằng nếu bạn sử dụng 'tên_bảng.new_name' thì nó sẽ trở thành [lược đồ]. [Table_name]. [Table_name.new_name] - vì vậy đừng đặt tên bảng đó vào tên mới! (nó đúng trong câu trả lời này, chỉ cần thêm một ghi chú cho peeps)
Mark Schultheiss

1
Nếu có một lược đồ trong cơ sở dữ liệu, bạn phải đặt tên lược đồ trước tên bảng: EXEC sp_RENAME 'giản lược_ame.table_name.old_name', 'new_name', 'COLUMN'
amin

105

Ngoài ra SQL, bạn có thể làm điều này trong Microsoft SQL Server Management Studio. Dưới đây là một vài cách nhanh chóng bằng GUI:

Cách thứ nhất

Nhấp đúp chuột vào cột. Tên cột sẽ trở thành một hộp văn bản có thể chỉnh sửa.


Cách thứ hai

Nhấp chuột phải vào cột và chọn Đổi tên từ menu ngữ cảnh.

Ví dụ:

Đổi tên cột


Cách thứ ba

Cách này thích hợp hơn khi bạn cần đổi tên nhiều cột trong một lần.

  1. Nhấp chuột phải vào bảng chứa cột cần đổi tên.
  2. Nhấp vào Thiết kế .
  3. Trong bảng thiết kế bảng, bấm và chỉnh sửa hộp văn bản của tên cột bạn muốn thay đổi.

Ví dụ: Ví dụ thiết kế bảng MSSMS

LƯU Ý: Tôi biết OP đặc biệt yêu cầu giải pháp SQL, nghĩ rằng điều này có thể giúp người khác :)


1
Hoặc người dùng không có đặc quyền.
Carrie Kendall

6
Không bao giờ làm điều đó. Bạn đang sao chép bảng, sau đó bỏ cái cũ và đổi tên nó. KHÔNG BAO GIỜ sử dụng GUI EVER để thay đổi bất cứ điều gì về bảng.
HLGEM

6
@HLGEM đó là một tuyên bố chăn khá lớn. Trong mọi trường hợp, bạn có thể cung cấp bất kỳ tài nguyên nào cho những gì bạn đã giải thích không? tức là đánh rơi bàn, v.v.
Carrie Kendall

2
@CarrieKendall, kịch bản thay đổi từ GUI thay vì thực hiện và bạn sẽ thấy. Đây là lý do tại sao việc thay đổi bằng GUI sang một bảng lớn chậm hơn nhiều so với sử dụng sp_rename hoặc bảng thay đổi. Hơn nữa, các thay đổi đối với cấu trúc cơ sở dữ liệu là các thay đổi mã và phải nằm trong kiểm soát nguồn như các mã khác nên có trong tập lệnh. Điều này đặc biệt quan trọng nếu bạn không cho phép nhà sản xuất quyền cơ sở dữ liệu thay đổi bảng vì bạn sẽ cần tập lệnh trong mọi trường hợp. Và bạn không muốn sao chép, bỏ và tạo lại các bảng với hàng triệu bản ghi trên sản phẩm.
HLGEM

18
Tôi vừa đổi tên bảng SQL Server 2012 bằng Management Studio với trình chạy profiler và nó sử dụng sp_rename. Không thể nói cho các phiên bản trước mặc dù.
Steve Dowling

58

Thử:

EXEC sp_rename 'TableName.OldName', 'NewName', 'COLUMN'

27

Bạn cũng nên chỉ định lược đồ của bảng hoặc bạn có thể gặp lỗi này:

Msg 15248, Cấp 11, Trạng thái 1, Quy trình sp_rename, Dòng 238 Hoặc tham số @objname không rõ ràng hoặc @objtype (COLUMN) được tuyên bố là sai.

Nếu nó là một kịch bản triển khai, tôi cũng khuyên bạn nên thêm một số bảo mật bổ sung cho nó.

IF EXISTS (
        SELECT 1
        FROM sys.columns
        WHERE
            name = 'OldColumnName' AND
            object_name(object_id) = 'TableName'
    ) AND
    NOT EXISTS (
        SELECT 1
        FROM sys.columns
        WHERE
            name = 'NewColumnName' AND
            object_name(object_id) = 'TableName'
    )
    EXEC sp_RENAME 'SchemaName.TableName.OldColumnName', 'NewColumnName', 'COLUMN';

Tôi thích cách tiếp cận an toàn này, tốt cho việc viết di chuyển mà có thể / có thể không chạy trên các môi trường khác nhau.
Adil H. Raza

giống như kiểm tra sự tồn tại, khiến tôi cảm thấy ok chạy lại như là một phần của một loạt các kịch bản khác
biết

19

Nó sẽ là một gợi ý tốt để sử dụng một chức năng đã được tích hợp sẵn nhưng một cách khác là:

  1. Tạo một cột mới với cùng kiểu dữ liệu và TÊN MỚI.
  2. Chạy một câu lệnh UPDATE / INSERT để sao chép tất cả dữ liệu vào cột mới.
  3. Thả cột cũ.

Lợi ích đằng sau việc sử dụng sp_renamelà nó chăm sóc tất cả các mối quan hệ liên quan đến nó.

Từ tài liệu :

sp_rename tự động đổi tên chỉ mục được liên kết bất cứ khi nào một ràng buộc CHÍNH hoặc UNIITE được đổi tên. Nếu một chỉ mục được đổi tên được gắn với một ràng buộc PRIMARY KEY, ràng buộc PRIMARY KEY cũng được tự động đổi tên bởi sp_rename. sp_rename có thể được sử dụng để đổi tên các chỉ mục XML chính và phụ.


* Trong bước 1 NULL phải được cho phép trong cột mới * Tùy chọn thêm bước thứ 4 để thay đổi cột mới, nó không cho phép các giá trị NULL
BitLauncher

16

Bạn có thể sử dụng sp_renameđể đổi tên một cột.

USE YourDatabase;  
GO  
EXEC sp_rename 'TableName.OldColumnName', 'NewColumnName', 'COLUMN';  
GO  

Tham số đầu tiên là đối tượng phải được sửa đổi, tham số thứ hai là tên mới sẽ được trao cho các đối tượng, và tham số thứ ba COLUMN thông báo cho máy chủ đó đổi tên là cho column, và cũng có thể được sử dụng để đổi tên tables, indexalias data type .


2
Không hiểu, tại sao bạn thêm câu trả lời mới thậm chí trên 4 trên 5 đề cập đến sp_rename ...?
Pawel Czapski

3
Tại một số điểm, ai đó sẽ phải giải thích ở đây hoạt động của tham số, không ai làm điều này
Alexandre Neukirchen

1
Vâng, thực sự bạn đúng, đối với tôi điều đó là quá rõ ràng nhưng đối với những người mới có thể thì không.
Pawel Czapski

12

Vì tôi thường đến đây và sau đó tự hỏi làm thế nào để sử dụng dấu ngoặc, câu trả lời này có thể hữu ích cho những người như tôi.

EXEC sp_rename '[DB].[dbo].[Tablename].OldColumnName', 'NewColumnName', 'COLUMN'; 
  • Các OldColumnNamekhông phải []. Nó sẽ không làm việc.
  • Đừng đưa NewColumnNamevào [], nó sẽ dẫn đến [[NewColumnName]].

3

Xưởng quản lý máy chủ Sql có một số quy trình được lưu trữ do hệ thống lưu trữ (SP)
Một trong số đó được sử dụng để đổi tên một cột. SP là sp_rename

Cú pháp: sp_rename '[table_name] .old_column_name', 'new_column_name'
Để được trợ giúp thêm, hãy tham khảo bài viết này: sp_rename bởi Microsoft Docs

Lưu ý: Khi thực hiện SP này, máy chủ sql sẽ cung cấp cho bạn một thông báo thận trọng là ' Thận trọng: Thay đổi bất kỳ phần nào của tên đối tượng có thể phá vỡ các tập lệnh và thủ tục được lưu trữ '. Điều này chỉ quan trọng nếu bạn đã viết sp của riêng mình liên quan đến cột trong bảng bạn sắp thay đổi.


2

Phiên bản cải tiến của @Taher

DECLARE @SchemaName AS VARCHAR(128)
DECLARE @TableName AS VARCHAR(128)
DECLARE @OldColumnName AS VARCHAR(128)
DECLARE @NewColumnName AS VARCHAR(128)
DECLARE @ParamValue AS VARCHAR(1000)

SET @SchemaName = 'dbo'
SET @TableName = 'tableName'
SET @OldColumnName = 'OldColumnName'
SET @NewColumnName = 'NewColumnName'
SET @ParamValue = @SchemaName + '.' + @TableName + '.' + @OldColumnName

IF EXISTS
(
    SELECT 1 FROM sys.columns WHERE name = @OldColumnName AND OBJECT_NAME(object_id) = @TableName
)
AND NOT EXISTS
(
    SELECT 1 FROM sys.columns WHERE name = @NewColumnName AND OBJECT_NAME(object_id) = @TableName
)
BEGIN
    EXEC sp_rename @ParamValue, @NewColumnName, 'COLUMN';
END

0

Hoặc bạn chỉ có thể nhấp chậm hai lần vào cột trong SQL Management Studio và đổi tên thông qua UI ...


-1

Chạy truy vấn:

    SP_RENAME '[TableName].[ColumnName]','NewNameForColumn'

Xin vui lòng không lặp lại câu trả lời lâu dài và hiện có với nhiều phiếu bầu.
TT.
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.