INDEX COL: примеры (SQL)
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 годов функция сохраняет свою оригинальную сигнатуру и поведение. Основные изменения касаются совместимости с системными представлениями, которые стали предпочтительным методом получения метаданных.
В будущих версиях функция может быть помечена как устаревшая, но на текущий момент официальных заявлений о ее удалении нет.
Расширенные примеры
Получение всех столбцов для конкретного индекса:
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;
ENDPosition | ColumnName 1 | EmployeeID 2 | NationalIDNumber
Использование в динамическом 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;Сравнение структуры индексов между двумя таблицами:
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');