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

Использование функции OBJECTPROPERTYEX в Microsoft SQL Server
Раздел: Функции работы с метаданными
OBJECTPROPERTYEX(id, property): sql_variant

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

Функция OBJECTPROPERTYEX возвращает информацию о свойствах объектов схемы в базе данных SQL Server. Она расширяет возможности OBJECTPROPERTY, добавляя поддержку свойств для расширенных объектов и параметров.

Функция применяется для получения метаданных объектов: таблиц, представлений, хранимых процедур, функций. Это полезно для скриптов, которые требуют анализа структуры базы данных.

Синтаксис функции:

OBJECTPROPERTYEX ( id , property )

Аргументы:
id - идентификатор объекта типа int. Может быть получен с помощью функции OBJECT_ID.
property - выражение типа varchar(128), указывающее возвращаемое свойство.

Возвращаемые значения:
Функция возвращает значение sql_variant. Конкретный тип данных зависит от запрашиваемого свойства. Возвращает NULL, если указано несуществующее свойство или отсутствуют права на объект.

Основные категории свойств:
- Общие свойства объектов (ExecIsQuotedIdentOn, ExecIsAnsiNullsOn)
- Свойства таблиц и представлений (TableHasClustIndex, TableHasForeignKey)
- Свойства хранимых процедур и функций (IsDeterministic, IsSchemaBound)
- Свойства триггеров (ExecIsTriggerDisabled)

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

Проверка наличия кластерного индекса у таблицы:

SELECT OBJECTPROPERTYEX(OBJECT_ID('Sales.SalesOrderHeader'), 'TableHasClustIndex') AS HasClusteredIndex;
HasClusteredIndex
-----------------
1

Определение детерминированности функции:

SELECT OBJECTPROPERTYEX(OBJECT_ID('dbo.ufnGetProductDealerPrice'), 'IsDeterministic') AS IsDeterministic;
IsDeterministic
---------------
0

Проверка привязки к схеме для представления:

SELECT OBJECTPROPERTYEX(OBJECT_ID('HumanResources.vEmployee'), 'IsSchemaBound') AS IsSchemaBound;
IsSchemaBound
--------------
0

Определение типа объекта:

SELECT OBJECTPROPERTYEX(OBJECT_ID('Production.Product'), 'BaseType') AS ObjectType;
ObjectType
----------
U

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

SQL Server предоставляет несколько функций для получения метаданных объектов:

OBJECTPROPERTY - предшественник OBJECTPROPERTYEX с меньшим количеством поддерживаемых свойств. Рекомендуется использовать OBJECTPROPERTYEX для новой разработки.

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

SERVERPROPERTY - возвращает свойства экземпляра SQL Server. Полезна для получения информации о версии, редакции, параметрах сервера.

DATABASEPROPERTYEX - возвращает свойства базы данных. Используется для проверки параметров базы, таких как уровень совместимости, состояние.

Выбор функции зависит от типа необходимых метаданных: OBJECTPROPERTYEX для объектов схемы, DATABASEPROPERTYEX для свойств базы данных.

Альтернативы в других СУБД

MySQL: INFORMATION_SCHEMA или SHOW команды:

SELECT TABLE_TYPE FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_SCHEMA = 'database' AND TABLE_NAME = 'table';
TABLE_TYPE
----------
BASE TABLE

Oracle: Представления USER_, ALL_, DBA_OBJECTS и словарь данных:

SELECT OBJECT_TYPE, STATUS FROM USER_OBJECTS 
WHERE OBJECT_NAME = 'EMPLOYEES';
OBJECT_TYPE  STATUS
-----------  ------
TABLE        VALID

PostgreSQL: Системный каталог pg_class и информационные схемы:

SELECT relkind, relhasindex FROM pg_class 
WHERE relname = 'table_name';
relkind  relhasindex
-------  -----------
r        t

SQLite: Прагма table_info или запросы к sqlite_master:

SELECT type, sql FROM sqlite_master 
WHERE name = 'table_name';

Каждая СУБД использует собственную систему метаданных. OBJECTPROPERTYEX специфична для SQL Server и не имеет прямых аналогов с идентичным синтаксисом.

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

Использование имени объекта вместо идентификатора:

-- Неправильно
SELECT OBJECTPROPERTYEX('Sales.SalesOrderHeader', 'TableHasClustIndex');

-- Правильно
SELECT OBJECTPROPERTYEX(OBJECT_ID('Sales.SalesOrderHeader'), 'TableHasClustIndex');
Сообщение об ошибке 8116: Аргумент 1 для функции OBJECTPROPERTYEX должен иметь тип int.

Запрос свойств для несуществующих объектов:

SELECT OBJECTPROPERTYEX(999999, 'TableHasClustIndex') AS Result;
Result
------
NULL

Неправильное написание имени свойства:

SELECT OBJECTPROPERTYEX(OBJECT_ID('Sales.SalesOrderHeader'), 'TableHasClasterIndex');
Result
------
NULL

Проверка свойств для объектов без соответствующих прав доступа:

-- Под пользователем без прав на объект
SELECT OBJECTPROPERTYEX(OBJECT_ID('sys.objects'), 'TableHasClustIndex');
Result
------
NULL

Изменения в последних версиях

В SQL Server 2016 и более поздних версиях добавлена поддержка свойства IsMemoryOptimized для таблиц, оптимизированных для памяти.

SQL Server 2019 расширил возможности функции, добавив свойство IsExternal для внешних таблиц.

В Azure SQL Database обновления добавляются непрерывно. Рекомендуется проверять документацию для получения актуальной информации о поддерживаемых свойствах.

Для обратной совместимости OBJECTPROPERTY продолжает поддерживать большинство свойств, но новые свойства добавляются только в OBJECTPROPERTYEX.

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

Получение списка всех таблиц с первичным ключом в базе данных:

Пример sql
SELECT 
    SCHEMA_NAME(o.schema_id) AS SchemaName,
    o.name AS TableName
FROM sys.objects o
WHERE o.type = 'U' 
    AND OBJECTPROPERTYEX(o.object_id, 'TableHasPrimaryKey') = 1
ORDER BY SchemaName, TableName;
SchemaName  TableName
----------  ---------
Sales       SalesOrderDetail
Sales       SalesOrderHeader
Production  Product
HumanResources  Employee

Определение, использует ли представление параметры ANSI NULLS и QUOTED IDENTIFIER:

Пример sql
SELECT 
    OBJECTPROPERTYEX(OBJECT_ID('dbo.vTestView'), 'ExecIsAnsiNullsOn') AS UsesAnsiNulls,
    OBJECTPROPERTYEX(OBJECT_ID('dbo.vTestView'), 'ExecIsQuotedIdentOn') AS UsesQuotedIdentifier;
UsesAnsiNulls  UsesQuotedIdentifier
-------------  --------------------
1              1

Проверка всех свойств для конкретного объекта:

Пример sql
DECLARE @ObjectId INT = OBJECT_ID('Sales.SalesOrderHeader');

SELECT 'TableHasClustIndex' AS Property, 
    OBJECTPROPERTYEX(@ObjectId, 'TableHasClustIndex') AS Value
UNION ALL
SELECT 'TableHasForeignKey', 
    OBJECTPROPERTYEX(@ObjectId, 'TableHasForeignKey')
UNION ALL
SELECT 'TableHasUniqueConst', 
    OBJECTPROPERTYEX(@ObjectId, 'TableHasUniqueConst')
UNION ALL
SELECT 'TableHasCheckConst', 
    OBJECTPROPERTYEX(@ObjectId, 'TableHasCheckConst');
Property              Value
--------------------  -----
TableHasClustIndex    1
TableHasForeignKey    1
TableHasUniqueConst   1
TableHasCheckConst    0

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

Пример sql
SELECT 
    OBJECTPROPERTYEX(OBJECT_ID('dbo.ufnGetContactInformation'), 'IsInlineFunction') AS IsInlineFunction;
IsInlineFunction
----------------
1

Проверка поддержки схемы выполнения для процедуры:

Пример sql
SELECT 
    OBJECTPROPERTYEX(OBJECT_ID('dbo.uspGetEmployeeManagers'), 'IsReplicated') AS IsReplicated,
    OBJECTPROPERTYEX(OBJECT_ID('dbo.uspGetEmployeeManagers'), 'IsSchemaBound') AS IsSchemaBound;
IsReplicated  IsSchemaBound
-------------  -------------
0              0

MS SQL OBJECTPROPERTYEX function comments

En
OBJECTPROPERTYEX Returns information about objects in the current database (extended)