OBJECTPROPERTYEX: примеры (SQL)
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.
Расширенные примеры
Получение списка всех таблиц с первичным ключом в базе данных:
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:
SELECT
OBJECTPROPERTYEX(OBJECT_ID('dbo.vTestView'), 'ExecIsAnsiNullsOn') AS UsesAnsiNulls,
OBJECTPROPERTYEX(OBJECT_ID('dbo.vTestView'), 'ExecIsQuotedIdentOn') AS UsesQuotedIdentifier;UsesAnsiNulls UsesQuotedIdentifier ------------- -------------------- 1 1
Проверка всех свойств для конкретного объекта:
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
Определение, является ли функция встроенной табличной:
SELECT
OBJECTPROPERTYEX(OBJECT_ID('dbo.ufnGetContactInformation'), 'IsInlineFunction') AS IsInlineFunction;IsInlineFunction ---------------- 1
Проверка поддержки схемы выполнения для процедуры:
SELECT
OBJECTPROPERTYEX(OBJECT_ID('dbo.uspGetEmployeeManagers'), 'IsReplicated') AS IsReplicated,
OBJECTPROPERTYEX(OBJECT_ID('dbo.uspGetEmployeeManagers'), 'IsSchemaBound') AS IsSchemaBound;IsReplicated IsSchemaBound ------------- ------------- 0 0