重命名索引会给出错误显式 @objtype ID 无法识别



我正在尝试重命名索引并收到错误:

错误:无法识别显式@objtype"idx_FinData20"。

我可以看到表和索引都存在。那么问题出在哪里

IF ( EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'dbo' AND  TABLE_NAME ='FinData2000_1_old'))
BEGIN
EXEC sp_rename  'FinData2000_1_old.idx_FinData2000_1' , 'idx_FinData2000_1', 'idx_FinData20 00_1_old'
end

首先 - 你的语法是错误的。你只需要两个参数,第一个应该是table_name.old_name的,第二个只是new name。 其次 - 新索引名称中有一个额外的空格,这会破坏脚本。

EXEC sp_rename 'FinData2000_1_old.idx_FinData2000_1' , 'idx_FinData2000_1_old'

您使用了错误的语法SP_RENAME,默认情况下,它接受两个输入,第一个是old name,第二个是new name,如果你指定第三个(可选和用于比较对象),那应该是object name

我不确定适合您的情况是什么,但作为示例,您可以尝试以下方法:

EXEC SP_RENAME 'INDEX_OLD_NAME', 'INDEX_NEW_NAME', 'INDEX'

补充说明:执行rename将有破坏剩余过程的潜在风险。

learn.microsoft.com 指定@ObjType只能具有以下值之一。


数据库
索引
对象
统计信息(SQL Server 2012 (11.x) 及更高版本以及 Azure SQL 数据库。
用户数据类型

有用于重命名表和视图的内部过程,这些过程会自动处理表和视图引用以进行@ObjType。 因此,如果您要重命名表/视图,请省略@ObjType因为引擎足够智能,可以自行解决。

还要确保在@ObjName中包含架构(即使它只是 dbo,因此将来包含它成为您的第二天性......),因为不同的架构中可能有相同的命名表。

还值得注意的是,重命名表后,对旧表创建的任何索引都会自动更新,以引用刚刚将其更新为的新表名。

我终于发现有些对象需要引用。 这可以通过QUOTENAME()功能完成。

例如,我有一个名为PK_dbo.SafetyDataSheets的 EF6 创建的主键约束。

要重命名此约束名称,可以使用以下内容:

EXEC sp_rename 'dbo.' + QUOTENAME(`PK_dbo.SafetyDataSheets`), 'PK_SafetyDataSheets'

最新更新