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

MS SQL Server функция OBJECT_NAME - практические примеры работы
Раздел: Системные информационные функции, Метаданные
OBJECT_NAME(object_id [, database_id]): sysname

Функция OBJECT_NAME в MS SQL Server

Функция OBJECT_NAME предназначена для возвращения имени объекта базы данных по указанному идентификатору объекта. Ее основное использование связано с динамическим получением имен объектов при работе с системными представлениями (такими как sys.objects, sys.partitions и др.), которые часто возвращают только числовые идентификаторы (object_id).

Аргументы функции

  • object_id (INT): Обязательный аргумент. Идентификатор объекта в текущей базе данных.
  • database_id (INT): Необязательный аргумент. Идентификатор базы данных, в которой находится объект. Если аргумент опущен, функция выполняется в контексте текущей базы данных.

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

Функция возвращает имя объекта типа nvarchar(128). Если указанный object_id не существует, функция возвращает NULL. Если для объекта нет разрешений, функция также вернет NULL.

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

Базовое использование

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

SELECT OBJECT_NAME(123456);
NULL

Использование в запросе к системному представлению.

SELECT OBJECT_NAME(object_id) AS TableName, * FROM sys.partitions WHERE index_id < 2;
TableName | partition_id | object_id | ...
-----------|--------------|-----------|-----
Products  | 12345        | 123456    | ...
Categories| 12346        | 234567    | ...

Использование с указанием базы данных

USE master;
SELECT OBJECT_NAME(123456, DB_ID('AdventureWorks2019')) AS ObjectName;
ObjectName
----------
SomeTable

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

OBJECT_SCHEMA_NAME

Возвращает имя схемы для объекта по его идентификатору. Принимает те же аргументы (object_id, database_id). Предпочтительнее использовать, когда требуется именно имя схемы, а не объекта.

SCHEMA_NAME

Возвращает имя схемы по идентификатору схемы. Используется, когда известен schema_id, а не object_id.

OBJECT_ID

Обратная функция. Возвращает идентификатор объекта по его имени. Часто используется перед OBJECT_NAME для проверки существования объекта.

Рекомендации по выбору

  • Для получения полного двухкомпонентного имени удобно комбинировать OBJECT_SCHEMA_NAME и OBJECT_NAME.
  • Функция OBJECT_ID часто используется в условиях IF для проверки существования объектов перед их изменением.

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

PostgreSQL

Используется функция pg_identify_object или запросы к системному каталогу pg_class.

SELECT relname FROM pg_class WHERE oid = 12345;
relname
-------
mytable

Oracle

Запросы к словарным представлениям, таким как USER_OBJECTS, ALL_OBJECTS, DBA_OBJECTS.

SELECT object_name FROM user_objects WHERE object_id = 12345;
OBJECT_NAME
-----------
MYTABLE

MySQL

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

SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'dbname' LIMIT 1;
TABLE_NAME
----------
mytable

SQLite

Нет встроенных функций. Имена объектов получают из системной таблицы sqlite_master.

SELECT name FROM sqlite_master WHERE type='table' AND rootpage=2;
name
----
test

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

Типичные ошибки при использовании

NULL из-за отсутствия разрешений

Функция возвращает NULL, если у пользователя нет разрешений на объект, даже если он существует.

-- Пользователь без прав на таблицу SECRET_TABLE
SELECT OBJECT_NAME(OBJECT_ID('SECRET_TABLE'));
NULL

Неверный контекст базы данных

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

USE tempdb;
-- object_id из AdventureWorks
SELECT OBJECT_NAME(123456);
NULL

Передача несуществующего object_id

Функция возвращает NULL, что может привести к логическим ошибкам, если результат не обрабатывается.

SELECT OBJECT_NAME(999999999) AS Name;
Name
----
NULL

Изменения в функции

Поведение функции OBJECT NAME не претерпевало значительных изменений в последних версиях MS SQL Server. Основные аспекты ее работы остаются стабильными с SQL Server 2005. Однако, в новых версиях могут добавляться новые типы объектов, которые также поддерживаются функцией. Важно учитывать, что функция всегда работает в контексте совместимости базы данных.

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

Динамическое построение запросов

Использование в составе динамического SQL для операций с объектами, найденными через системные представления.

Пример sql
DECLARE @TableName NVARCHAR(128);
SELECT @TableName = OBJECT_NAME(parent_object_id) FROM sys.foreign_keys WHERE name = 'FK_Product_ProductCategory';
PRINT 'Родительская таблица для внешнего ключа: ' + @TableName;
Родительская таблица для внешнего ключа: Product

Агрегация и группировка по именам объектов

Получение статистики по таблицам из sys.partitions с преобразованием object_id в читаемые имена.

Пример sql
SELECT
    OBJECT_NAME(object_id) AS TableName,
    COUNT(*) AS PartitionCount
FROM sys.partitions
GROUP BY OBJECT_NAME(object_id)
HAVING COUNT(*) > 1
ORDER BY PartitionCount DESC;
TableName | PartitionCount
----------|---------------
Sales     | 12
Log       | 6

Использование в JOIN для удобочитаемости отчетов

Соединение системных представлений с функцией для вывода понятных имен.

Пример sql
SELECT
    OBJECT_NAME(k.parent_object_id) AS ParentTable,
    OBJECT_NAME(k.referenced_object_id) AS ReferencedTable,
    k.name AS ConstraintName
FROM sys.foreign_keys k
WHERE OBJECT_NAME(k.parent_object_id) LIKE 'Prod%';
ParentTable | ReferencedTable | ConstraintName
------------|-----------------|----------------
Product     | ProductCategory | FK_Product_Category

Поиск объектов по шаблону с использованием идентификаторов

Поиск всех ограничений в таблице, имя которой известно лишь частично.

Пример sql
DECLARE @TableId INT = OBJECT_ID('%Product%');
SELECT name, type_desc
FROM sys.objects
WHERE parent_object_id = @TableId
    AND OBJECT_NAME(parent_object_id) LIKE '%Product%';
name | type_desc
-----|----------
CK_Product_ListPrice | CHECK_CONSTRAINT
DF_Product_SellDate | DEFAULT_CONSTRAINT

MS SQL OBJECT_NAME function comments

En
OBJECT NAME Returns the database object name for schema-scoped objects