OBJECT NAME: примеры (SQL)
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 для операций с объектами, найденными через системные представления.
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 в читаемые имена.
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 для удобочитаемости отчетов
Соединение системных представлений с функцией для вывода понятных имен.
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
Поиск объектов по шаблону с использованием идентификаторов
Поиск всех ограничений в таблице, имя которой известно лишь частично.
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