ChatGPT解决这个技术问题 Extra ChatGPT

重命名列 SQL Server 2008

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

ALTER TABLE table_name RENAME COLUMN old_name to new_name;

这种说法是行不通的。

请注意,这与 swetha 链接的问题 #174582 并不完全重复:这个是特定于 MS SQL 的,另一个是与数据库无关的。

C
Community

使用sp_rename

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

请参阅:SQL SERVER – How to Rename a Column Name or Table Name

文档:sp_rename (Transact-SQL)

对于您的情况,它将是:

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

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


请注意,您不应将 NewColumnName 放在括号中,因为 SQL Server 将使用 [[[NewColumnName]]] 作为新列的名称。此外,sp_rename 应以 EXEC 或 EXECUTE 为前缀。
允许并鼓励您将括号放在第一个参数中,以标识列,但不要在第二个参数中。像这样:EXEC sp_RENAME '[TableName].[OldColumnName]', 'NewColumnName', 'COLUMN'
您应该在回答中注意,此存储过程在重命名时处理默认值、null 等 约束,而不是在存在此类约束时将失败的普通 alter table
请注意,如果您使用 'table_name.new_name' 则它变为 [schema].[table_name].[table_name.new_name] - 所以不要将该表名放在新名称中! (这个答案是正确的,只是为窥视添加了一个注释)
如果数据库中有模式,则必须将模式名称放在表名之前:EXEC sp_RENAME 'schema_name.table_name.old_name', 'new_name', 'COLUMN'
C
Community

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

第一种方式

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

第二种方式

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

例如:

https://i.stack.imgur.com/zygEz.jpg

第三条路

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

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

https://i.stack.imgur.com/UwVU4.png

注意:我知道 OP 专门要求 SQL 解决方案,认为这可能对其他人有帮助:)


或者用户没有权限。
永远不要那样做。您正在复制表格,然后删除旧表格并重命名它。永远不要使用 GUI 来更改有关表的任何内容。
@HLGEM 这是一个相当大的一揽子声明。无论如何,您能否为您所解释的内容提供任何资源?即丢表等。
@CarrieKendall,从 GUI 编写更改而不是编写更改脚本,您会看到。这就是为什么使用 GUI 对大表进行更改比使用 sp_rename 或 alter table 进行更改要慢得多的原因。此外,对数据库结构的更改是代码更改,应该像其他代码一样在源代码控制中,因此应该在脚本中。如果您不允许开发生产数据库权限更改表,这一点尤其重要,因为无论如何您都需要脚本。而且您不想在 prod 上复制、删除和重新创建具有数百万条记录的表。
我刚刚使用运行探查器的 Management Studio 重命名了一个 SQL Server 2012 表,它使用了 sp_rename。虽然不能代表早期版本。
T
TechDo

尝试:

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

M
MarredCheese

您还应该指定表的架构,否则您可能会收到此错误:

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

我喜欢这种安全的方法,非常适合编写可能/可能不会在不同环境中运行的迁移。
就像存在检查一样,让我感觉可以作为一批其他脚本的一部分重新运行
A
Alexandre Neukirchen

您可以使用 sp_rename 重命名列。

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

第一个参数是要修改的对象,第二个参数是要赋予对象的新名称,第三个参数COLUMN通知服务器重命名是针对column的,也可用于重命名 tablesindexalias data type


不明白,为什么您在提到 sp_rename 的 5 次中有 4 次以上时还要添加新的答案...?
有的时候,这里得有人解释一下参数的操作,没有人这样做
是的,实际上你是对的,对我来说这很明显,但对于新人来说可能不是。
H
HonzaB

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

EXEC sp_rename '[DB].[dbo].[Tablename].OldColumnName', 'NewColumnName', 'COLUMN'; 

OldColumnName 不能在 [] 中。不起作用。

不要把NewColumnName放到[]中,结果会变成[[NewColumnName]]。


K
Kolappan N

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

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

使用 sp_rename 的好处是它可以处理与其相关的所有关系。

documentation

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


* 在第 1 步中,新列中必须允许 NULL * 可选地添加第 4 步来更改新列,它不允许 NULL 值
T
Tahir77667

Sql Server 管理工作室有一些系统定义的存储过程(SP),其中一个用于重命名列。SP 是 sp_rename

语法: sp_rename '[table_name].old_column_name', 'new_column_name'
如需更多帮助,请参阅这篇文章:sp_rename by Microsoft Docs

注意:在执行此 SP 时,sql server 会给您一条警告消息,如“警告:更改对象名称的任何部分都可能破坏脚本和存储过程”。仅当您编写了自己的涉及该列的 sp 时,这一点才至关重要在您即将更改的表格中。


R
Rikin Patel

@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

D
Dave Cole

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


P
Purnima Bhatia

运行查询:

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

请不要重复很多赞成票的长期和现有答案。