#sql #sql-server #ddl #database-indexes
#sql #sql-server #ddl #база данных-индексы
Вопрос:
У меня есть некластеризованный индекс по двум строкам в таблице, который включает в себя несколько столбцов. Индекс используется представлением, и теперь представление обновлено, чтобы включить другой столбец. Обычно я записываю изменения базы данных, чтобы они сначала проверялись, если изменение уже было применено, что, очевидно, означает, например, что столбец не добавляется несколько раз случайно при повторном запуске скрипта.
Я хочу добавить новый столбец в индекс, удалив и воссоздав его (если только нет способа включить дополнительный столбец без повторного создания индекса). Но я хотел бы сначала проверить, содержит ли индекс столбец. Есть ли простой способ проверить?
Ответ №1:
Я думаю, что это предоставит список столбцов для всех ваших индексов (с указанием имени таблицы, имени индекса и имени столбца). Я полагаю, что я правильно установил связи между ними, но, пожалуйста, проверьте вручную (например, протестируйте его на индексе без столбца, а затем на новой версии индекса со столбцом).
Затем вы можете добавить предложения where/IF EXISTS / etc по желанию.
SELECT so.name AS [TableName],
si.name AS [IndexName],
sc.name AS [IndexColumnName]
FROM sys.indexes AS si
INNER JOIN sys.objects AS so ON so.object_id = si.object_id AND is_ms_shipped = 0
INNER JOIN sys.index_columns AS sic ON si.object_id = sic.object_id AND si.index_id = sic.index_id
INNER JOIN sys.columns AS sc ON sic.object_id = sc.object_id AND sic.column_id = sc.column_id
Обратите внимание, что sys.index_columns
в нем есть поле is_included_column
(равное 1 или 0), которое вы можете использовать, чтобы определить, является ли оно «включенной» частью индекса, если требуется.