OBJECTPROPERTY: примеры (SQL)

Функция OBJECTPROPERTY в SQL Server: свойства объектов
Раздел: Функции работы с метаданными
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. Рекомендуется обращаться к официальной документации для актуального списка свойств в конкретной версии сервера.

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

Поиск всех пользовательских таблиц в базе данных:

Пример sql
SELECT name FROM sys.objects 
WHERE OBJECTPROPERTY(object_id, 'IsUserTable') = 1;
name
----------
Employees
Orders
Products

Проверка, является ли таблица системной:

Пример sql
SELECT OBJECTPROPERTY(OBJECT_ID('sys.objects'), 'IsMSShipped') AS IsSystemObject;
IsSystemObject
--------------
1

Определение, имеет ли таблица триггеры:

Пример sql
SELECT OBJECTPROPERTY(OBJECT_ID('Sales.Orders'), 'IsTrigger') AS HasTriggers;
HasTriggers
-----------
1

Проверка, является ли объект встроенной табличной функцией:

Пример sql
SELECT OBJECTPROPERTY(OBJECT_ID('dbo.GetOrders'), 'IsInlineFunction') AS IsInlineFunc;
IsInlineFunc
------------
0

Определение, защищен ли объект от изменений с помощью шифрования:

Пример sql
SELECT OBJECTPROPERTY(OBJECT_ID('dbo.EncryptedProc'), 'IsEncrypted') AS IsEncrypted;
IsEncrypted
-----------
1

Использование в динамическом SQL для условного выполнения операций:

Пример sql
IF OBJECTPROPERTY(OBJECT_ID('dbo.TempTable'), 'IsTable') = 1
    PRINT 'Таблица существует';
ELSE
    PRINT 'Таблица отсутствует';
Таблица существует

MS SQL OBJECTPROPERTY function comments

En
OBJECTPROPERTY Returns information about objects in the current database