SQL Server重命名表

时间:2019-06-27 02:06:38

标签: sql-server

我通过重命名表内容来切换它们,以便最新数据进入主表。它也会自动在两个表上都包含索引吗?

EXEC sp_rename 'MAIN', 'TMP';
EXEC sp_rename 'LATEST', 'MAIN';
EXEC sp_rename 'TMP', 'LATEST';

谢谢!

1 个答案:

答案 0 :(得分:2)

每个表都有一个object_id,它所知道的名称只是该对象的一个​​属性。您可以使用以下查询在sys.objects视图中列出问题中的每个表:

select *
from db_nm.sys.objects as o
where o.name in ('MAIN', 'TMP', 'LATEST')
and o.type = 'U' --filtering to (user-defined) Tables only

sys.indexes视图中列出的每个索引显示两个ID。第一个是index_id,它是索引本身的ID,而object_id是被索引的对象的ID。

这意味着当您使用sp_rename来更改表的名称时,唯一发生的事情是对象的name属性被更新,并且没有任何ID号被更改。

换句话说,如果index_a在重命名表之前指向对象123456,则此后它仍将指向该对象。

更新

您可以使用下面的查询来验证表/索引的设置,该查询将为每个表/索引组合返回一条记录。

select s.name as schema_nm
, o.name as table_nm
, i.name as index_nm
from db_nm.sys.objects as o
inner join db_nm.sys.schemas as s on o.schema_id = s.schema_id
left join db_nm.sys.indexes as i on o.object_id = i.object_id
where o.type = 'U'
and o.name in ('MAIN', 'TMP', 'LATEST')
order by 1, 2, 3