【问题标题】:Rename column SQL Server 2008重命名列 SQL Server 2008
【发布时间】:2013-04-24 04:19:40
【问题描述】:

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

ALTER TABLE table_name RENAME COLUMN old_name to new_name;

这个说法不成立。

【问题讨论】:

标签: sql sql-server sql-server-2008 alter-table


【解决方案1】:

使用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'
【解决方案2】:

试试:

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

【讨论】:

    【解决方案3】:

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

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

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

    来自documentation

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

    【讨论】:

    • * 在第 1 步中,新列中必须允许 NULL * 可选地添加第 4 步来更改新列,它不允许 NULL 值
    【解决方案4】:

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

    第一路

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


    第二种方式

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

    例如:


    第三条路

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

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

    例如:

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

    【讨论】:

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

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

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

    【讨论】:

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

    您可以使用sp_rename 重命名列。

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

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

    【讨论】:

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

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

    EXEC sp_rename '[DB].[dbo].[Tablename].OldColumnName', 'NewColumnName', 'COLUMN'; 
    
    • OldColumnName 不能在[] 中。它不会起作用。
    • 不要将NewColumnName 放入[],否则会变成[[NewColumnName]]

    【讨论】:

      【解决方案8】:

      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 时才至关重要,该 sp 涉及您将要更改的表中的列。

      【讨论】:

        【解决方案9】:

        @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
        

        【讨论】:

          【解决方案10】:

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

          【讨论】:

            【解决方案11】:

            运行查询:

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

            【讨论】:

            • 请不要重复长期存在的和现有的答案,并投很多赞成票。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-09-11
            • 2013-01-24
            • 2011-04-03
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多