INDEX COL: примеры (SQL)

MS SQL функция INDEX_COL: применение и примеры
Раздел: Функции работы с метаданными
INDEX_COL('[ database_name . [ schema_name ] . | schema_name . ] table_or_view_name', index_id, key_id): nvarchar(128)

Описание функции INDEX_COL

INDEX_COL

- это системная функция в MS SQL Server, возвращающая имя индексированного столбца. Она применяется для получения сведений о структуре индексов таблицы в контексте метаданных.

Функция используется преимущественно для административных задач и анализа схемы базы данных, когда требуется определить, какие столбцы включены в конкретный индекс. Это полезно при оптимизации запросов или рефакторинге структуры базы.

Аргументы

  • 'table' - имя таблицы или объектный идентификатор таблицы, содержащей индекс. Может быть указано как строковое значение или идентификатор объекта.
  • index_id - целочисленный идентификатор индекса. Нумерация начинается с 1.
  • key_id - целочисленный номер позиции столбца в индексе. Нумерация начинается с 1.

Возвращаемое значение

Функция возвращает строку (nvarchar) с именем столбца на указанной позиции индекса. Если индекс или столбец не существуют, возвращается NULL.

Примеры использования INDEX_COL

Простой пример для таблицы с одним индексом:

SELECT INDEX_COL('Sales.SalesOrderHeader', 1, 1) AS IndexColumnName;
IndexColumnName
------------------------------
SalesOrderID

Использование с переменными:

DECLARE @table_name NVARCHAR(128) = 'Person.Person';
DECLARE @index_id INT = 2;
DECLARE @key_id INT = 1;
SELECT INDEX_COL(@table_name, @index_id, @key_id) AS ColumnName;
ColumnName
----------------
LastName

Обработка случая с несуществующим индексом:

SELECT INDEX_COL('Production.Product', 999, 1) AS Result;
Result
-------
NULL

Альтернативные функции в MS SQL

Для получения информации об индексах предпочтительнее использовать системные представления:

  • sys.index_columns - содержит сведения обо всех столбцах, входящих в индексы. Позволяет получить более полную информацию, включая тип столбца и порядок сортировки.
  • sys.indexes - основное представление для метаданных индексов.
  • sys.columns - информация о столбцах таблиц.

Пример запроса с использованием системных представлений:

SELECT c.name AS ColumnName
FROM sys.indexes i
JOIN sys.index_columns ic ON i.object_id = ic.object_id AND i.index_id = ic.index_id
JOIN sys.columns c ON ic.object_id = c.object_id AND ic.column_id = c.column_id
WHERE i.name = 'IX_Product_Name' AND i.object_id = OBJECT_ID('Production.Product');

Системные представления предоставляют больше деталей и обычно используются в сложных административных скриптах, тогда как INDEX_COL удобна для быстрых разовых запросов.

Аналоги функции в других СУБД

PostgreSQL: Используется системный каталог pg_index и функция pg_get_indexdef.

SELECT attname FROM pg_attribute
WHERE attrelid = 'table_name'::regclass AND attnum = ANY(
    SELECT unnest(indkey) FROM pg_index WHERE indexrelid = 'index_name'::regclass
);

Oracle: Запрос к представлению USER_IND_COLUMNS.

SELECT column_name FROM user_ind_columns
WHERE index_name = 'INDEX_NAME' AND column_position = 1;

MySQL: Информация об индексах хранится в INFORMATION_SCHEMA.STATISTICS.

SELECT column_name FROM information_schema.statistics
WHERE table_schema = 'database' AND table_name = 'table' AND index_name = 'index';

В отличие от MS SQL, эти системы не имеют прямой аналогичной функции, а используют запросы к метаданным.

Типичные ошибки

1. Использование несуществующего имени таблицы приводит к возврату NULL без явного сообщения об ошибке.

SELECT INDEX_COL('NonExistentTable', 1, 1);
NULL

2. Передача отрицательных значений или нуля в качестве index_id или key_id также возвращает NULL.

SELECT INDEX_COL('Production.Product', -1, 0);
NULL

3. Ошибка при указании имени таблицы без кавычек, если оно содержит специальные символы или пробелы.

SELECT INDEX_COL(My Table, 1, 1);
Сообщение об ошибке синтаксиса.

Изменения в последних версиях

Функция INDEX_COL остается неизменной с ранних версий MS SQL Server. В документации к SQL Server 2019 и 2022 годов функция сохраняет свою оригинальную сигнатуру и поведение. Основные изменения касаются совместимости с системными представлениями, которые стали предпочтительным методом получения метаданных.

В будущих версиях функция может быть помечена как устаревшая, но на текущий момент официальных заявлений о ее удалении нет.

Расширенные примеры

Получение всех столбцов для конкретного индекса:

Пример sql
DECLARE @i INT = 1;
WHILE INDEX_COL('HumanResources.Employee', 1, @i) IS NOT NULL
BEGIN
    SELECT @i AS Position, INDEX_COL('HumanResources.Employee', 1, @i) AS ColumnName;
    SET @i = @i + 1;
END
Position | ColumnName
1        | EmployeeID
2        | NationalIDNumber

Использование в динамическом SQL для анализа индексов:

Пример sql
DECLARE @sql NVARCHAR(MAX) = '';
SELECT @sql = @sql + 'SELECT ''' + i.name + ''' AS IndexName, ''' + 
    INDEX_COL(t.name, i.index_id, 1) + ''' AS FirstColumn UNION ALL '
FROM sys.indexes i
JOIN sys.tables t ON i.object_id = t.object_id
WHERE i.index_id > 0;
SET @sql = LEFT(@sql, LEN(@sql) - 10);
EXEC sp_executesql @sql;

Сравнение структуры индексов между двумя таблицами:

Пример sql
SELECT 
    INDEX_COL('Table1', i1.index_id, 1) AS Table1_Column,
    INDEX_COL('Table2', i2.index_id, 1) AS Table2_Column
FROM sys.indexes i1, sys.indexes i2
WHERE i1.object_id = OBJECT_ID('Table1') AND i2.object_id = OBJECT_ID('Table2');

MS SQL INDEX_COL function comments

En
INDEX COL Returns the indexed column name