重命名SQL Server 2008列


652

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

ALTER TABLE table_name RENAME COLUMN old_name to new_name;

该语句不起作用。



5
请注意,这与问题#174582(与swetha链接)不是完全相同的:该问题是特定于MS SQL的,而与数据库无关。

Answers:


1193

采用 sp_rename

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

请参阅:SQL SERVER –如何重命名列名或表名

文档:sp_rename(Transact-SQL)

对于您的情况将是:

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

请记住使用单引号将您的值括起来。


24
请注意,请勿将NewColumnName放在方括号中,因为SQL Server随后将使用[[[NewColumnName]]]作为新列的名称。另外,sp_rename应该以EXEC或EXECUTE开头。
Mark Freeman 2013年

29
允许并鼓励您将方括号放在第一个参数中,以标识列,但不要在第二个参数中。像这样:EXEC sp_RENAME '[TableName].[OldColumnName]', 'NewColumnName', 'COLUMN'
Niels Brinch

2
你应该在你的答案注意,此存储过程的手柄默认值,空等约束上,而这样做重命名,而不是一个简单的alter table,如果存在这样的约束将失败。
TuncayGöncüoğlu的

4
请注意,如果您使用“ table_name.new_name”,则它将变为[schema]。[table_name]。[table_name.new_name]-因此,请勿将该表名放在新名称中!(在此答案中是正确的,只是添加了对偷看的音符)
Mark Schultheiss

1
如果有一个模式在数据库中,您有之前的表名放在架构名称:EXEC sp_RENAME“schema_name.table_name.old_name”,“new_name的”,“列”
阿明

106

或者到SQL,您可以在Microsoft SQL Server Management Studio中做到这一点。以下是使用GUI的几种快速方法:

第一路

缓慢双击该列。列名将成为可编辑的文本框。


第二路

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

例如:

重命名列名


第三路

当您需要一次性重命名多个列时,这种方式是更可取的。

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

例如: MSSMS表设计示例

注意:我知道OP特别要求SQL解决方案,以为这可能对其他人有所帮助:)


1
或用户没有特权。
卡莉·肯德尔

6
永远不要那样做。您正在复制表,然后删除旧表并重命名。永远不要使用GUI EVER来更改有关表的任何内容。
HLGEM 2014年

6
@HLGEM这是一个非常笼统的声明。无论如何,您能否提供您所解释的任何资源?即放下桌子等
。–凯莉·肯德尔

2
@CarrieKendall,而不是进行更改,而是从GUI脚本化更改,您将看到。这就是为什么使用GUI对大表进行更改要比使用sp_rename或alter table慢得多。此外,对数据库结构的更改是代码更改,应该像其他代码一样在源代码控制中,因此应该在脚本中。如果您不允许开发人员生产数据库权限更改表,这尤其重要,因为无论如何您都需要脚本。而且,您不想复制,删除和重新创建带有生产记录中数百万条记录的表。
HLGEM 2014年

18
我刚刚使用运行Profiler的Management Studio重命名了SQL Server 2012表,并使用了sp_rename。但是不能说早期版本。
史蒂夫·道林

58

尝试:

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

27

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

消息15248,级别11,状态1,过程sp_rename,第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';

我喜欢这种安全的方法,非常适合编写可能会/可能不会在不同环境上运行的迁移。
阿迪尔·拉扎

像存在检查一样,让我感觉可以作为其他脚本的一部分重新运行
未知

19

建议使用已经内置的功能,但另一种方法是:

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

使用the的好处sp_rename是它可以处理与之关联的所有关系。

文档中

只要重命名PRIMARY KEY或UNIQUE约束,sp_rename都会自动重命名关联的索引。如果将重命名的索引绑定到PRIMARY KEY约束,则PRIMARY KEY约束也会由sp_rename自动重命名。sp_rename可用于重命名主要和辅助XML索引。


*在步骤1中,必须在新列中允许NULL *可以选择添加第4步来更改新列,因为它不允许NULL值
BitLauncher

16

您可以使用sp_rename重命名列。

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

第一个参数是将被修改的对象,第二个参数是将要提供给对象的新的名称,和第三参数COLUMN通知服务器,该重命名为所述column,并且也可以用于重命名tablesindexalias data type


2
不明白,为什么还要在有关sp_rename ...的5分之4中添加新答案?
Pawel Czapski

3
在某个时候,必须有人在这里解释参数的操作,而没有人这样做
Alexandre Neukirchen

1
是的,实际上您是对的,对我而言,这是如此明显,但对于新伙计们可能并非如此。
Pawel Czapski

12

由于我经常来这里,然后想知道如何使用方括号,因此该答案可能对像我这样的人有用。

EXEC sp_rename '[DB].[dbo].[Tablename].OldColumnName', 'NewColumnName', 'COLUMN'; 
  • OldColumnName不能在[]。不起作用。
  • 不要把NewColumnName进入[],它会导致成[[NewColumnName]]

3

Sql Server Management Studio具有一些系统定义的存储过程(SP),
其中一个用于重命名列.SP为sp_rename

语法: sp_rename'[table_name] .old_column_name','new_column_name'
有关更多帮助,请参考本文: Microsoft Docs提供的sp_rename

注意:执行此SP时,SQL Server会给您一条警告消息,内容为“警告:更改对象名称的任何部分都可能会破坏脚本和存储过程 ”。在表格中您将要更改。


2

@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

或者,您也可以在SQL Management Studio中的列上缓慢单击两次,然后通过UI重命名。


-1

运行查询:

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

请不要以很多赞成票重复长期存在的答案。
TT。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.