【问题标题】:How to rename a table in SQL Server?如何重命名 SQL Server 中的表?
【发布时间】:2011-07-17 04:06:41
【问题描述】:

我使用的SQL 查询是:

ALTER TABLE oldtable RENAME TO newtable;

但是,它给了我一个错误。

服务器:消息 156,级别 15,状态 1,第 1 行
关键字“TO”附近的语法不正确。

【问题讨论】:

    标签: sql-server rename alter-table


    【解决方案1】:

    要使用不同的架构更改表名:

    示例:将 dbo.MyTable1 更改为 wrk.MyTable2

    EXEC SP_RENAME 'dbo.MyTable1', 'MyTable2'
    
    ALTER SCHEMA wrk TRANSFER dbo.MyTable2
    

    【讨论】:

      【解决方案2】:

      表名

      sp_rename 'db_name.old_table_name', 'new_table_name'
      

      sp_rename 'db_name.old_table_name.name' 'userName', 'COLUMN'
      

      索引

      sp_rename 'db_name.old_table_name.id', 'product_ID', 'INDEX'
      

      也可用于静态和数据类型

      【讨论】:

      • 对于 Column 您在第一个和第二个参数之间缺少逗号。应该是:sp_rename 'db_name.old_table_name.name', 'userName', 'COLUMN'
      【解决方案3】:

      如果您尝试 exec sp_rename 并收到 LockMatchID 错误,那么首先添加一条 use [database] 语句可能会有所帮助:

      我试过了

       exec sp_rename '[database_name].[dbo].[table_name]', 'new_table_name';
       -- Invalid EXECUTE statement using object "Object", method "LockMatchID".
      

      我必须做的就是把它改写成:

      use database_name
      exec sp_rename '[dbo].[table_name]', 'new_table_name';
      

      【讨论】:

        【解决方案4】:

        这里提出的建议没有任何效果.. 所以只是将数据放入新表中

        SELECT * 
        INTO [acecodetable].['PSCLineReason']
        FROM [acecodetable].['15_PSCLineReason'];
        

        也许对某人有用..

        在我的情况下,它无法识别新架构,而且 dbo 是所有者..

        更新

        EXECUTE sp_rename N'[acecodetable].[''TradeAgreementClaim'']', N'TradeAgreementClaim';
        

        为我工作。 我从更新其中一张表的 PK 时自动生成的脚本中找到了它。 这样它也能识别出新的模式。

        【讨论】:

          【解决方案5】:

          要重命名 SQL Server 中的表,请使用 sp_rename 命令:

          exec sp_rename 'schema.old_table_name', 'new_table_name'
          

          【讨论】:

          • 还有一件事:如果任何表名中包含.,请在表名周围使用[]。 (我知道,我知道,但点可能会发生......) sp_rename '[Stupid.name]', 'NewName' 或架构 sp_rename '[dbo.Stupid.name]', 'NewName'
          • 再补充一点,不要不小心把架构放在'NewName'字段中,否则你的表可能最终看起来像dbo.dbo.NewName
          • 请记住,在重命名表时,您几乎肯定希望同时重命名存储过程、视图、函数等中可能存在的对该表的任何引用。 A快速谷歌可以找到可以为您执行此操作的众多工具之一。或者,您可以使用脚本在所有这些对象中查找给定字符串,并将它们粘贴为 ALTER 语句,然后执行查找和替换,然后全部运行。
          • 也可以创建一个以旧表名命名的同义词指向新表CREATE SYNONYM [schema].[synonymName] FOR [schema].[tableName]
          • 不要将新名称放在方括号中!否则该表的名称中将包含方括号。所以:'new_table_name' - 是正确的,'[new_table_name]' - 会给你带来麻烦
          【解决方案6】:

          要重命名列:

          sp_rename 'table_name.old_column_name', 'new_column_name' , 'COLUMN';
          

          要重命名表:

          sp_rename 'old_table_name','new_table_name';
          

          【讨论】:

            【解决方案7】:

            当使用与上述答案类似的 sp_rename 时,还要检查哪些对象在重命名后受到影响,即引用该表,因为您也需要更改这些对象

            我在 Pinal Dave 的博客 here 上拿了一个表依赖的代码示例

            USE AdventureWorks
            GO
            SELECT
            referencing_schema_name = SCHEMA_NAME(o.SCHEMA_ID),
            referencing_object_name = o.name,
            referencing_object_type_desc = o.type_desc,
            referenced_schema_name,
            referenced_object_name = referenced_entity_name,
            referenced_object_type_desc = o1.type_desc,
            referenced_server_name, referenced_database_name
            --,sed.* -- Uncomment for all the columns
            FROM
            sys.sql_expression_dependencies sed
            INNER JOIN
            sys.objects o ON sed.referencing_id = o.[object_id]
            LEFT OUTER JOIN
            sys.objects o1 ON sed.referenced_id = o1.[object_id]
            WHERE
            referenced_entity_name = 'Customer'
            

            所以,所有这些依赖对象也需要更新

            如果可以的话,或者使用一些插件,其中一些具有重命名对象的功能,并且所有依赖对象也可以

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2011-02-20
              • 1970-01-01
              • 2020-08-21
              • 2017-09-24
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多