如何在SQL Server中重命名表?

470

我所使用的SQL查询语句是:

ALTER TABLE oldtable RENAME TO newtable;

但是它给了我一个错误。

服务器: Msg 156, Level 15, State 1, Line 1
关键词 'TO' 附近语法不正确。

7个回答

857

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

exec sp_rename 'schema.old_table_name', 'new_table_name'

19
还有一件事:如果任何一个表名中包含,则在表名周围使用[]。例如,sp_rename '[Stupid.name]', 'NewName' 或带模式的表 sp_rename '[dbo.Stupid.name]', 'NewName' - vacip
94
另外要注意,不要把模式(schema)错误地放在“'NewName'”字段中,否则你的表可能会变成类似于“dbo.dbo.NewName”的样子。 - Michael Plautz
5
记住,当重命名一个表时,几乎肯定还要重命名存储过程、视图、函数等中可能存在的对该表的引用。可以通过快速搜索谷歌来找到许多能够帮助你完成此操作的工具。或者,您可以使用一个查找所有这些对象中给定字符串的脚本,并将它们粘贴为ALTER语句,然后进行查找和替换,最后运行它们。 - MGOwen
3
您还可以创建一个以旧表名命名的同义词,指向新表 CREATE SYNONYM [schema].[synonymName] FOR [schema].[tableName] - Ruskin
6
不要在方括号中放置新名称!否则,表格的名称中将会有方括号。 因此:'new_table_name'是正确的,“[new_table_name]”会给你带来麻烦。 - VeganHunter
1
@vacip 如果你输入 sp_rename '[dbo.Stupid.name]',操作将会失败。正确的写法是:sp_rename '[dbo].[Stupid.name]' - Jari Turkia

163

重命名列:

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

重命名表:

sp_rename 'old_table_name','new_table_name';

这里只是一个提醒,Azure Synapse Analytics SQL Pools中的sp_rename仅支持重命名列。目前还不支持重命名表或索引。 https://learn.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-rename-transact-sql?view=sql-server-ver16 - TrailJon

28

表名

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'

也适用于静态和数据类型。


3
对于Column,你缺少第一个和第二个参数之间的逗号。 应该是:sp_rename 'db_name.old_table_name.name','userName','COLUMN' - sebastian.roibu

16

当使用类似上面答案中的 sp_rename 时,请检查重命名后引用该表的对象,因为您还需要更改这些对象

我在 Pinal Dave 的博客 这里 中找到了一个表依赖项的代码示例

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'

因此,所有这些依赖对象也需要进行更新

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


14

如果您尝试使用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';

7

更改具有不同模式的表名:

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

EXEC SP_RENAME 'dbo.MyTable1', 'MyTable2'

ALTER SCHEMA wrk TRANSFER dbo.MyTable2

1

这里提供的方法都没有奏效,所以我只是将数据倒入了新表中。

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

也许对某些人有用..

在我的情况下,它没有识别新的模式,同时dbo是所有者..

更新

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

对我很有帮助。我是从更新一个表的PK时自动生成的脚本中找到的。这样它也能识别新的模式。


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