SQL Server переименовывает таблицы - PullRequest
0 голосов
/ 27 июня 2019

Я переключаю содержимое своих таблиц, переименовывая их, чтобы последние данные попадали в основную таблицу. Включает ли он автоматически индексы в обеих таблицах?

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

Спасибо! * * 1004

1 Ответ

2 голосов
/ 27 июня 2019

Каждая таблица имеет 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 просмотр, показывает два идентификатора.Первый - это index_id, который является идентификатором самого индекса, и object_id, который является идентификатором индексируемого объекта.

Это означает, что при использовании sp_rename для изменения именитаблицы, единственное, что происходит, это то, что атрибут name объекта обновляется, и ни один из идентификационных номеров не изменяется.

Другими словами, если 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...