如何在SQL Server中重命名表?


369

SQL我使用的查询是:

ALTER TABLE oldtable RENAME TO newtable;

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

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

Answers:


683

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

exec sp_rename 'schema.old_table_name', 'new_table_name'

7
还有一件事:如果表名中有一个,请在表名前后.使用[]。(我知道,我知道,但是点可能会发生...)例如,sp_rename '[Stupid.name]', 'NewName'或使用模式sp_rename '[dbo.Stupid.name]', 'NewName'
vacip

55
另外,请不要将模式意外地放在'NewName'字段中,否则您的表可能最终看起来像dbo.dbo.NewName
Michael Plautz

4
请记住,重命名表时,几乎可以肯定的是,您还想重命名存储过程,视图,函数等中可能存在的对该表的任何引用。快速Google可以找到许多可以为您完成此操作的工具之一。或者,您可以使用一个脚本在所有这些对象中找到给定的字符串,并将其粘贴为ALTER语句,然后进行查找和替换,然后全部运行。
MGOwen '17

2
您还可以创建一个以旧表名命名的同义词,该新表指向新表CREATE SYNONYM [schema].[synonymName] FOR [schema].[tableName]
Ruskin

不要将新名称放在方括号中!否则表格的名称中将带有方括号。所以:'new_table_name'-是正确的,'[new_table_name]'-将使您陷入麻烦
VeganHunter


14

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

我把对表的依赖关系的代码示例,在皮纳尔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'

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

或者,如果可以的话,使用一些加载项,其中一些具有重命名对象的功能,所有依赖的对象也都具有


11

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

10

表名

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'

也可用于静态和数据类型


2
对于Column,您缺少第一个参数和第二个参数之间的逗号。应为:sp_rename'db_name.old_table_name.name','userName','COLUMN'–
sebastian.roibu


0

这里没有提出任何建议..因此,将数据细化到新表中

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

也许对某人有用。

在我的情况下,它也无法识别新模式,因此dbo是所有者。

更新

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

为我工作。我从更新表之一的PK时自动生成的脚本中找到了它。这样,它也可以识别新的架构。


0

要使用其他模式更改表名:

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

EXEC SP_RENAME 'dbo.MyTable1', 'MyTable2'

ALTER SCHEMA wrk TRANSFER dbo.MyTable2
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.