OBJECTPROPERTY: примеры (SQL)
OBJECTPROPERTY(id, property): intОписание функции OBJECTPROPERTY в MS SQL
Функция OBJECTPROPERTY в Microsoft SQL Server используется для получения информации о свойствах объектов в текущей базе данных. Она возвращает значение типа int, указывающее на наличие или состояние определенного свойства у указанного объекта. Функция применяется для проверки метаданных объектов, таких как таблицы, представления, процедуры, функции, триггеры и другие.
Синтаксис функции: OBJECTPROPERTY(id, property), где id - идентификатор объекта (тип int) и property - строковое выражение, указывающее проверяемое свойство. В качестве id можно использовать функцию OBJECT_ID для получения идентификатора по имени объекта.
Возвращаемые значения: 1 (свойство присутствует или истинно), 0 (свойство отсутствует или ложно) или NULL (в случае ошибки, например, неверный идентификатор или свойство).
Аргумент property может принимать множество значений, например:
- IsTable - проверка, является ли объект таблицей.
- IsView - проверка, является ли объект представлением.
- IsPrimaryKey - проверка, является ли объект первичным ключом.
- IsIndexed - проверка, имеет ли таблица индексы.
- IsUserTable - проверка, является ли таблица пользовательской.
- IsProcedure - проверка, является ли объект хранимой процедурой.
- IsScalarFunction - проверка, является ли объект скалярной функцией.
- IsMSShipped - проверка, создан ли объект системой (например, во время установки).
Примеры использования OBJECTPROPERTY
Проверка, является ли объект таблицей:
SELECT OBJECTPROPERTY(OBJECT_ID('Sales.Orders'), 'IsTable') AS IsTable;IsTable -------- 1
Проверка, является ли объект представлением:
SELECT OBJECTPROPERTY(OBJECT_ID('dbo.MyView'), 'IsView') AS IsView;IsView ------ 0
Проверка, имеет ли таблица первичный ключ:
SELECT OBJECTPROPERTY(OBJECT_ID('Employees'), 'IsPrimaryKey') AS HasPrimaryKey;HasPrimaryKey ------------- 1
Проверка, является ли функция скалярной:
SELECT OBJECTPROPERTY(OBJECT_ID('dbo.CalculateTotal'), 'IsScalarFunction') AS IsScalarFunc;IsScalarFunc ------------ 1
Похожие функции в MS SQL
В MS SQL существуют другие функции для работы с метаданными объектов:
- OBJECT_DEFINITION - возвращает текст определения объекта (например, процедуры или функции). Удобна для просмотра исходного кода.
- OBJECT_NAME - возвращает имя объекта по его идентификатору. Полезна для обратного преобразования.
- COLUMNPROPERTY - проверяет свойства столбца таблицы (например, допускает ли NULL). Применяется для анализа столбцов.
- INDEXPROPERTY - возвращает свойства индекса таблицы. Используется для получения информации об индексах.
OBJECTPROPERTY предпочтительнее для проверки общих свойств объектов (тип, наличие ключей), в то время как COLUMNPROPERTY и INDEXPROPERTY ориентированы на конкретные аспекты столбцов и индексов.
Альтернативы в других СУБД
В других базах данных существуют аналогичные механизмы для получения метаданных объектов:
MySQL: Используются запросы к информационной схеме INFORMATION_SCHEMA. Пример проверки типа таблицы:
SELECT TABLE_TYPE FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'database' AND TABLE_NAME = 'table';TABLE_TYPE ---------- BASE TABLE
Oracle: Применяются представления словаря данных, например USER_OBJECTS. Пример проверки типа объекта:
SELECT OBJECT_TYPE FROM USER_OBJECTS WHERE OBJECT_NAME = 'MY_TABLE';OBJECT_TYPE ----------- TABLE
PostgreSQL: Используется системный каталог pg_catalog. Пример проверки типа объекта:
SELECT relkind FROM pg_class WHERE relname = 'my_table';relkind ------- r
SQLite: Метаданные доступны через запросы к таблице sqlite_master. Пример проверки типа объекта:
SELECT type FROM sqlite_master WHERE name = 'my_table';type ---- table
В отличие от MS SQL, где функция OBJECTPROPERTY инкапсулирует логику проверки, в других СУБД чаще используются прямые запросы к системным таблицам или представлениям.
Типичные ошибки при использовании
Распространенные ошибки включают передачу неверного имени объекта или неподдерживаемого свойства:
Ошибка при указании несуществующего объекта, возвращается NULL:
SELECT OBJECTPROPERTY(OBJECT_ID('NonExistentTable'), 'IsTable') AS Result;Result ------ NULL
Ошибка при указании недопустимого свойства, также возвращается NULL:
SELECT OBJECTPROPERTY(OBJECT_ID('Employees'), 'InvalidProperty') AS Result;Result ------ NULL
Ошибка при передаче NULL в качестве идентификатора объекта, возвращается NULL:
SELECT OBJECTPROPERTY(NULL, 'IsTable') AS Result;Result ------ NULL
Для избежания ошибок рекомендуется проверять существование объекта с помощью OBJECT_ID перед использованием функции.
Изменения в последних версиях MS SQL
В SQL Server 2012 и более поздних версиях добавлены новые свойства для функции OBJECTPROPERTY, такие как IsMemoryOptimized для проверки оптимизированных для памяти таблиц. Также улучшена поддержка свойств, связанных с компонентами Always On и системой управления базами данных. В SQL Server 2016 и выше расширены свойства для работы с временными таблицами и индексами columnstore. Рекомендуется обращаться к официальной документации для актуального списка свойств в конкретной версии сервера.
Расширенные примеры применения
Поиск всех пользовательских таблиц в базе данных:
SELECT name FROM sys.objects
WHERE OBJECTPROPERTY(object_id, 'IsUserTable') = 1;name ---------- Employees Orders Products
Проверка, является ли таблица системной:
SELECT OBJECTPROPERTY(OBJECT_ID('sys.objects'), 'IsMSShipped') AS IsSystemObject;IsSystemObject -------------- 1
Определение, имеет ли таблица триггеры:
SELECT OBJECTPROPERTY(OBJECT_ID('Sales.Orders'), 'IsTrigger') AS HasTriggers;HasTriggers ----------- 1
Проверка, является ли объект встроенной табличной функцией:
SELECT OBJECTPROPERTY(OBJECT_ID('dbo.GetOrders'), 'IsInlineFunction') AS IsInlineFunc;IsInlineFunc ------------ 0
Определение, защищен ли объект от изменений с помощью шифрования:
SELECT OBJECTPROPERTY(OBJECT_ID('dbo.EncryptedProc'), 'IsEncrypted') AS IsEncrypted;IsEncrypted ----------- 1
Использование в динамическом SQL для условного выполнения операций:
IF OBJECTPROPERTY(OBJECT_ID('dbo.TempTable'), 'IsTable') = 1
PRINT 'Таблица существует';
ELSE
PRINT 'Таблица отсутствует';Таблица существует