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

Использование COL_NAME для работы с метаданными столбцов
Раздел: Системные информационные функции, Метаданные
COL_NAME(table_id, column_id): sysname

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

Функция COL_NAME в Microsoft SQL Server возвращает имя столбца таблицы по идентификатору объекта (таблицы) и идентификатору столбца в этой таблице. Эта функция используется, когда работа ведется с метаданными базы данных на уровне системных идентификаторов, а не имен. Часто она применяется в динамическом SQL, системных запросах или при анализе схемы базы данных.

Синтаксис: COL_NAME ( object_id , column_id [, database_id ] )

Аргументы:

  • object_id (тип int): Идентификатор объекта (таблицы или представления), содержащего столбец. Может быть получен с помощью функции OBJECT_ID.
  • column_id (тип int): Идентификатор столбца в указанном объекте. Обычно соответствует значению column_id из системного представления sys.columns.
  • database_id (тип int, необязательный, появился в SQL Server 2016): Идентификатор базы данных, в которой находится объект. Если аргумент опущен, функция работает в контексте текущей базы данных.

Возвращаемое значение: Функция возвращает значение типа nvarchar(128) — имя столбца. Если указаны недопустимые идентификаторы (объекта, столбца или базы данных), функция возвращает NULL.

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

Получение имени первого столбца таблицы Employees в текущей базе данных.

USE AdventureWorks2019;
SELECT COL_NAME(OBJECT_ID('HumanResources.Employee'), 1) AS ColumnName;
ColumnName
-----------
BusinessEntityID

Использование функции с указанием идентификатора базы данных.

SELECT COL_NAME(OBJECT_ID('Sales.SalesOrderHeader'), 3, DB_ID('AdventureWorks2019')) AS ColumnName;
ColumnName
-----------
RevisionNumber

Пример, когда функция возвращает NULL из-за неверного column_id.

SELECT COL_NAME(OBJECT_ID('HumanResources.Department'), 100) AS ColumnName;
ColumnName
-----------
NULL

Похожие функции в MS SQL Server

  • OBJECT_NAME: Возвращает имя объекта по его идентификатору. Используется для получения имен таблиц, представлений, процедур, а не отдельных столбцов.
  • COLUMNPROPERTY: Возвращает сведения о столбце или параметре (например, позволяет проверить, допускает ли столбец значения NULL, является ли столбец идентификатором). Работает с метаданными более детально, чем COL_NAME.
  • sys.columns: Системное представление, которое содержит полную информацию обо всех столбцах. Предпочтительнее для сложных запросов к метаданным, так как позволяет соединять данные и фильтровать результаты. COL_NAME удобнее для быстрого получения имени по известным идентификаторам в рамках одного вызова.

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

  • MySQL: Аналогичной встроенной функции нет. Имена столбцов получают из системной таблицы INFORMATION_SCHEMA.COLUMNS.
    SELECT COLUMN_NAME 
    FROM INFORMATION_SCHEMA.COLUMNS 
    WHERE TABLE_SCHEMA = 'database_name' AND TABLE_NAME = 'table_name' 
    ORDER BY ORDINAL_POSITION LIMIT 1;
  • Oracle: Функция SYS_GUID не является прямым аналогом. Используют представление USER_TAB_COLUMNS или ALL_TAB_COLUMNS.
    SELECT COLUMN_NAME FROM USER_TAB_COLUMNS 
    WHERE TABLE_NAME = 'EMPLOYEES' AND COLUMN_ID = 1;
  • PostgreSQL: Используют системный каталог information_schema.columns.
    SELECT column_name 
    FROM information_schema.columns 
    WHERE table_schema = 'public' AND table_name = 'employee' 
    ORDER BY ordinal_position OFFSET 0 LIMIT 1;
  • SQLite: Метаданные доступны через команду PRAGMA table_info(table_name);.
    PRAGMA table_info(Employees);

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

1. Использование неверного object_id. Если объект не существует, функция OBJECT_ID возвращает NULL, что приводит к ошибке в COL_NAME.

SELECT COL_NAME(NULL, 1); -- Возвращает NULL
SELECT COL_NAME(999999, 1); -- Возвращает NULL, если объект с таким ID не существует

2. Перепутан порядок аргументов. Аргументы object_id и column_id имеют одинаковый тип int, и их легко перепутать.

-- Неправильно: column_id указан как object_id
SELECT COL_NAME(1, OBJECT_ID('HumanResources.Employee')) AS ColumnName;
ColumnName
-----------
NULL

3. Ожидание, что column_id является непрерывной последовательностью, начиная с 1. В реальности column_id может иметь пробелы после удаления столбцов.

История изменений

В SQL Server 2016 (13.x) в функцию COL_NAME был добавлен третий необязательный аргумент — database_id. Это позволяет получать имя столбца для таблицы в другой базе данных без переключения контекста. В предыдущих версиях SQL Server функция принимала только два аргумента.

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

Использование в динамическом SQL для создания обобщенного кода.

Пример sql
DECLARE @TableName sysname = 'Employee', 
        @ColumnNumber int = 2,
        @ColumnName nvarchar(128),
        @SQL nvarchar(max);

SET @ColumnName = COL_NAME(OBJECT_ID(@TableName), @ColumnNumber);
SET @SQL = 'SELECT TOP 5 ' + QUOTENAME(@ColumnName) + ' FROM ' + QUOTENAME(@TableName);
EXEC sp_executesql @SQL;
-- Если @ColumnName = 'LoginID', выполнится: SELECT TOP 5 [LoginID] FROM [Employee]

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

Пример sql
SELECT sc.column_id,
       COL_NAME(sc.object_id, sc.column_id) AS column_name,
       st.name AS data_type
FROM sys.columns sc
JOIN sys.types st ON sc.system_type_id = st.system_type_id
WHERE sc.object_id = OBJECT_ID('HumanResources.Employee')
ORDER BY sc.column_id;

Использование в сочетании с другими метаданными для анализа схемы.

Пример sql
SELECT t.name AS TableName,
       COL_NAME(t.object_id, c.column_id) AS ColumnName,
       c.is_nullable
FROM sys.tables t
INNER JOIN sys.columns c ON t.object_id = c.object_id
WHERE t.is_ms_shipped = 0
ORDER BY t.name, c.column_id;

Применение с аргументом database_id для кросс-базового запроса.

Пример sql
-- Получение имени столбца из таблицы в другой базе данных
SELECT COL_NAME(OBJECT_ID('Sales.SalesOrderHeader'), 1, DB_ID('AdventureWorks2019')) AS ColumnNameInOtherDB;

MS SQL COL_NAME function comments

En
COL NAME Returns the name of a database column