Fn listextendedproperty: примеры (SQL)

Использование функции fn_listextendedproperty в SQL Server
Раздел: Функции для работы с расширенными свойствами, Метаданные
fn_listextendedproperty: table

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

Функция fn_listextendedproperty в MS SQL Server применяется для получения расширенных свойств, которые представляют собой пользовательские метаданные, присоединенные к объектам базы данных. Ее использование актуально при необходимости извлечения аннотаций, описаний или любой другой дополнительной информации, хранящейся в расширенных свойствах объектов схемы, таких как таблицы, столбцы, представления или процедуры.

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

Аргументы функции:

  • name (sysname, необязательный) — имя конкретного расширенного свойства для поиска. Если равно NULL, возвращаются все свойства.
  • level0_object_type (varchar(128), необязательный) — тип объекта верхнего уровня. Допустимые значения: 'USER', 'SCHEMA', 'DATABASE'.
  • level0_object_name (sysname, необязательный) — имя объекта, указанного в level0_object_type.
  • level1_object_type (varchar(128), необязательный) — тип объекта второго уровня. Примеры: 'TABLE', 'VIEW', 'PROCEDURE', 'FUNCTION'.
  • level1_object_name (sysname, необязательный) — имя объекта level1_object_type.
  • level2_object_type (varchar(128), необязательный) — тип объекта третьего уровня. Примеры: 'COLUMN', 'CONSTRAINT', 'PARAMETER'.
  • level2_object_name (sysname, необязательный) — имя объекта level2_object_type.

Структура возвращаемого набора данных:

  • objtype (sysname) — тип объекта, к которому привязано свойство.
  • objname (sysname) — имя этого объекта.
  • name (sysname) — имя расширенного свойства.
  • value (sql_variant) — значение, хранящееся в свойстве.

Короткие примеры использования

Получение всех расширенных свойств в текущей базе данных.

SELECT * FROM fn_listextendedproperty(NULL, NULL, NULL, NULL, NULL, NULL, NULL);
objtype | objname | name | value
--------|---------|------|-------
SCHEMA  | dbo     | MS_Description | Основная схема

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

SELECT * FROM fn_listextendedproperty(NULL, 'SCHEMA', 'dbo', 'TABLE', 'Employees', NULL, NULL);
objtype | objname   | name           | value
--------|-----------|----------------|-------
TABLE   | Employees | MS_Description | Таблица сотрудников

Поиск свойства с определенным именем для столбца.

SELECT * FROM fn_listextendedproperty('Описание', 'SCHEMA', 'dbo', 'TABLE', 'Employees', 'COLUMN', 'LastName');
objtype | objname   | name       | value
--------|-----------|------------|-------
COLUMN  | LastName  | Описание   | Фамилия сотрудника

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

В MS SQL существуют альтернативные методы работы с расширенными свойствами. Функция fn_listextendedproperty является табличной и удобна для выборок. Системная функция OBJECTPROPERTY позволяет получать некоторые стандартные свойства объектов по их идентификатору, но не пользовательские расширенные свойства.

Прямой запрос к системному представлению sys.extended_properties предоставляет полный контроль и возможность сложных соединений с другими каталогами. Хранимая процедура sp_addextendedproperty и связанные с ней процедуры (sp_updateextendedproperty, sp_dropextendedproperty) используются для управления свойствами.

Для простых сценариев выборки fn_listextendedproperty более удобна благодаря понятной иерархической фильтрации. Для сложных запросов или массовых операций предпочтительнее прямое обращение к sys.extended_properties.

Аналоги в других СУБД и языках

Концепция расширенных свойств или комментариев реализована в различных СУБД по-разному.

MySQL: Использует конструкцию COMMENT для таблиц и столбцов, которую можно получить из INFORMATION_SCHEMA.

SELECT COLUMN_COMMENT FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA='db' AND TABLE_NAME='tbl';
COLUMN_COMMENT
--------------
Комментарий к столбцу

Oracle: Комментарии хранятся в представлениях USER_TAB_COMMENTS, USER_COL_COMMENTS.

SELECT COMMENTS FROM USER_TAB_COMMENTS WHERE TABLE_NAME='EMPLOYEES';
COMMENTS
--------
Таблица сотрудников

PostgreSQL: Для хранения описаний используется системный каталог pg_description, а для получения — функция obj_description().

SELECT obj_description('public.employees'::regclass);
obj_description
---------------
Таблица сотрудников

SQLite: Прямой аналог отсутствует. Метаданные можно хранить только в пользовательских таблицах.

В отличие от MS SQL, в перечисленных системах обычно нет единой иерархической функции, аналогичной fn_listextendedproperty.

Распространенные ошибки

Типичной ошибкой является неверное указание иерархии объектов, приводящее к пустому результату.

-- Ошибка: Указан тип объекта 'TABLE', но не указана схема.
SELECT * FROM fn_listextendedproperty(NULL, NULL, NULL, 'TABLE', 'Employees', NULL, NULL);
(ни одной строки не возвращено)

Использование функции в контексте базы данных, отличной от той, где существуют свойства.

USE master;
SELECT * FROM fn_listextendedproperty(NULL, 'SCHEMA', 'dbo', 'TABLE', 'Employees', NULL, NULL);
-- Свойства находятся в пользовательской базе, поэтому результат будет пустым.

Попытка фильтрации по несуществующему имени свойства или объекта также возвращает пустой набор.

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

Функция fn_listextendedproperty была представлена в SQL Server 2005 и с тех пор ее сигнатура и поведение остаются стабильными. В последних версиях SQL Server (2016 и новее) не было внесено существенных изменений в работу этой функции. Поддержка сохраняется для обеспечения обратной совместимости.

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

Получение всех свойств для столбцов определенной таблицы с приведением типа значения.

Пример sql
SELECT
    objname AS ColumnName,
    name AS PropertyName,
    CAST(value AS NVARCHAR(MAX)) AS PropertyValue
FROM fn_listextendedproperty(NULL, 'SCHEMA', 'dbo', 'TABLE', 'Orders', 'COLUMN', NULL)
ORDER BY objname;
ColumnName | PropertyName | PropertyValue
-----------|--------------|--------------
OrderID    | Описание     | Уникальный идентификатор
OrderDate  | MS_Description | Дата оформления

Использование функции в соединении с другими системными представлениями для формирования документации.

Пример sql
SELECT
    t.name AS TableName,
    c.name AS ColumnName,
    ep.value AS Description
FROM sys.tables t
INNER JOIN sys.columns c ON t.object_id = c.object_id
OUTER APPLY fn_listextendedproperty('MS_Description', 'SCHEMA', SCHEMA_NAME(t.schema_id), 'TABLE', t.name, 'COLUMN', c.name) ep
WHERE t.is_ms_shipped = 0;
TableName | ColumnName | Description
----------|------------|------------
Employees| Email      | Адрес электронной почты
Products | Price      | Стоимость единицы товара

Поиск всех объектов, имеющих свойство с определенным значением.

Пример sql
SELECT objtype, objname, name, value
FROM fn_listextendedproperty(NULL, NULL, NULL, NULL, NULL, NULL, NULL)
WHERE CAST(value AS NVARCHAR(MAX)) LIKE '%критич%';
objtype | objname      | name           | value
--------|--------------|----------------|-------
TABLE   | LogEntries   | MS_Description | Критичная таблица журнала

MS SQL fn_listextendedproperty function comments

En
Fn listextendedproperty Returns the extended property values of database objects