Как получить в SQL Server список индексов всех таблиц со списком всех входящих колонок

добавлено: 22 дек 11
понравилось:0
просмотров: 6103
комментов: 4

теги:

Автор: joyecoder

Сегодня на работе я столкнулась с довольно интересным заданием, которое правда удалось решить только со второй попытке. Нужно было написать скрипт, который возвращает список всех существующих индексов с привязкой к таблицам выбранной базы данных в SQL Server, включая информацию о колонках, входящих в тот или иной индекс, не забывая про included колонки тоже. Как мне кажется, такая задача довольно часто встречается в буднях как рядовых программистов, так и DB администраторов. Посему я решила не жадничать и поделиться своими трудами. За одно и узнать, может кто находил более простое решение, требующее меньшее количество строчек кода.

Читать далее...

Комментарии


  • Я использую вот такой скрипт, возможно Вам пригодиться. Позволяет определять все параметры индекса и столбцов в нем.

    select
    i.object_id,
    i.index_id,
    i.type,
    OBJECT_SCHEMA_NAME(i.object_id,db_id()) as sch_name,
    object_name(i.object_id) obj_name,
    i.name idx_name,
    case i.is_unique when 0 then 'off' else 'on' end is_unique,
    case i.ignore_dup_key when 0 then 'off' else 'on' end ignore_dup_key,
    case i.is_unique_constraint when 0 then 'off' else 'on' end unique_constraint,
    i.fill_factor,
    case i.is_padded when 0 then 'off' else 'on' end is_padded,
    case i.is_hypothetical when 0 then 'off' else 'on' end is_hypothetical,
    case i.allow_page_locks when 0 then 'off' else 'on' end allow_page_locks,
    case i.allow_row_locks when 0 then 'off' else 'on' end allow_row_locks,
    T.ColumnName,
    T.is_descending_key as Column_is_desc_key,
    T.is_included_column
    from sys.indexes i
    cross apply
    (
    select
    c.name as ColumnName,
    ic.is_descending_key,
    ic.is_included_column
    from sys.index_columns ic
    join sys.all_columns c on c.object_id = ic.object_id and c.column_id = ic.index_column_id
    where ic.object_id = i.object_id
    and ic.index_id = i.index_id
    )T
    where i.type>0
    and i.is_primary_key = 0
    and OBJECT_SCHEMA_NAME(i.object_id,db_id()) != 'sys'
    order by i.object_id,i.index_id

  • Спасибо большое. Ваш скрипт натолкнул меня на мысль об улучшении собственного. К сожалению, мой текущий вариант не позволяет увидеть тип индекс(кластерный, некластерный, уникальный), фильтр для фильтрованных индексов и порядок сортировки колонок. В решении поставленной задачи это не требовалось. Но вообще очень полезная информация, посему сегодня усовершенствую.

  • В подзапросе key_columns следует учесть порядок следования колонок в индексе: order by ic.key_ordinal

  • Gluck_13, спасибо за найденную ошибку, исправила.



Необходимо войти на сайт, чтобы оставлять комментарии