重命名列 SQL Server 2008

798

我正在使用 SQL Server 2008 和 Navicat。我需要使用 SQL 在表中重命名一个列。

ALTER TABLE table_name RENAME COLUMN old_name to new_name;

这个声明不起作用。


2
请查看以下网址:https://dev59.com/SHVC5IYBdhLWcg3w0EsD - swetha
6
请注意,这与Swetha链接的问题#174582并不完全重复:这个问题是关于MS SQL特定的,而那个问题是关于数据库通用的。 - user565869
11个回答

1452

27
请注意,不要将NewColumnName放在括号中,因为SQL Server会将[[[NewColumnName]]]作为新列的名称。另外,sp_rename应该加上EXEC或EXECUTE前缀。 - Mark Freeman
32
您可以并且被鼓励在第一个参数中使用括号来标识列名,但是在第二个参数中不要使用括号。就像这样:EXEC sp_RENAME '[TableName].[OldColumnName]', 'NewColumnName', 'COLUMN' - Niels Brinch
3
你需要在回答中说明,此存储过程在重命名时处理默认值、空值等 约束条件 ,而普通的alter table操作将会失败,如果存在此类约束条件,则需要注意此点。 - Tuncay Göncüoğlu
6
请注意,如果您使用'table_name.new_name',那么它会变成[schema]。[table_name]。[table_name.new_name] - 因此不要将该表名放入新名称中!(这个答案已经是正确的了,只是为了提醒一下人们而添加了一条注释) - Mark Schultheiss
2
如果数据库中有模式,则必须在表名之前放置模式名称:EXEC sp_RENAME 'schema_name.table_name.old_name','new_name','COLUMN' - amin
使用Transact SQL:`EXEC sp_rename 'dbo.department.dept_id', 'id', 'column';` { 其中表名=department,dept_id=旧列名,id=新列名 } 参考文档:https://learn.microsoft.com/en-us/sql/relational-databases/tables/rename-columns-database-engine?view=sql-server-ver15#TsqlProcedure - Damilola Abioye

134

除了使用SQL之外,您可以在Microsoft SQL Server Management Studio中执行此操作。以下是一些使用GUI的快速方法:

第一种方法

双击列名,该列名将变成可编辑的文本框。


第二种方法

右键单击列,并从上下文菜单中选择“重命名”。

例如:

To Rename column name


第三种方法

当您需要一次重命名多个列时,此方法更为可取。

  1. 右键单击包含需要重命名的列的表。
  2. 点击 设计
  3. 在表格设计面板中,单击并编辑要更改的列名文本框。

例如: MSSMS Table Design Example

注意:我知道OP特别要求SQL解决方案,但这可能有助于其他人:)


1
或者用户没有权限。 - Carrie Kendall
6
绝对不要这样做。你正在复制表格,然后删除旧表并将其重命名。永远不要使用图形用户界面(GUI)来更改表格的任何内容。 - HLGEM
7
@HLGEM这是一个非常笼统的陈述。无论如何,你能提供任何关于你所解释的资源吗?例如删除表格等。 - Carrie Kendall
3
请使用GUI脚本化更改,而不是直接更改,你会发现这就是为什么使用GUI对大表进行更改比使用sp_rename或alter table慢得多的原因。此外,对数据库结构的更改是代码更改,应像其他代码一样在源代码控制中,因此应该放在脚本中。如果不允许开发人员在生产数据库中更改表,则尤其重要,因为你将需要该脚本。而且,你不想在生产环境中复制、删除和重新创建具有数百万条记录的表。 - HLGEM
22
我刚刚在使用Profiler的情况下,通过Management Studio重命名了一个SQL Server 2012表,它使用了sp_rename。不过我不确定早期版本是否也是这样。 - Steve Dowling
显示剩余4条评论

74

尝试:

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

40

您还应该指定表的架构,否则可能会出现以下错误:

  

Msg 15248,Level 11,State 1,Procedure sp_rename,Line 238   要么参数@objname不明确,要么声明的@objtype(COLUMN)是错误的。

如果这是一个部署脚本,我建议您还添加一些额外的安全性。

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';

我喜欢这种安全的方法,适合编写可能在不同环境下运行的迁移。 - Adil H. Raza
像存在检查这样的操作,让我感觉可以作为其他脚本批量运行的一部分而重新运行,这让我感到很好。 - unnknown

25

由于我经常来到这里,然后想知道如何使用括号,所以这个答案可能对像我一样的人有用。

EXEC sp_rename '[DB].[dbo].[Tablename].OldColumnName', 'NewColumnName', 'COLUMN'; 
  • OldColumnName 不能在 [] 中。这样是无效的。
  • 不要将 NewColumnName 放入 [] 中,否则会得到 [[NewColumnName]]

22
你可以使用sp_rename重命名列。
USE YourDatabase;  
GO  
EXEC sp_rename 'TableName.OldColumnName', 'NewColumnName', 'COLUMN';  
GO  

第一个参数是要修改的对象,第二个参数是将赋予对象的新名称,第三个参数COLUMN告知服务器重命名是针对,也可用于重命名索引别名数据类型


2
不理解,为什么你在已经有五个回答提到sp_rename的情况下还要添加新的回答呢? - Pawel Czapski
3
有个时候,有人需要在这里解释一下参数的操作,但是没有人这样做。 - Alexandre Neukirchen
1
是的,其实你说得对,对我来说很明显,但对新手可能不是。 - Pawel Czapski

20

使用已有的内置函数是一个好建议,但另一种方法是:

  1. 创建一个具有相同数据类型和新名称的新列。
  2. 运行 UPDATE/INSERT 语句将所有数据复制到新列中。
  3. 删除旧列。

使用 sp_rename 的好处在于它会处理与之关联的所有关系。

根据文档

当重新命名 PRIMARY KEY 或 UNIQUE 约束时,sp_rename 会自动重命名关联索引。如果重命名的索引与 PRIMARY KEY 约束相关联,则 sp_rename 还会自动重命名 PRIMARY KEY 约束。sp_rename 可用于重命名主要和次要 XML 索引。


在第一步中,必须允许在新列中使用NULL。 可选地,可以添加第四步来更改新列,使其不允许NULL值。 - BitLauncher

6

改进版@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

4

Sql Server管理工具包含一些系统定义的存储过程(SP),其中之一用于重命名列,该存储过程为sp_rename

语法: sp_rename '[表名].旧列名', '新列名'
如需更多帮助,请参考此文章:Microsoft Docs中的sp_rename

注意: 在执行此存储过程时,SQL Server会给出一个警告信息:“警告:更改对象名称的任何部分都可能破坏脚本和存储过程”。这只有在你编写了自己的包含将要更改的表中的列的存储过程时才是关键。


0

或者您可以在SQL Management Studio中对该列进行两次慢速单击,然后通过UI重命名它...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接