我正在尝试重命名索引并收到错误:
错误:无法识别显式@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'