May 3, 2018

Комментарии в SQL Server

Добавление комментариев к таблицам является слабой стороной SQL Server. Когда в других субд для этого присутствуют конструкции COMMENT ON, COMMENTS ON или комментарий указывается при создании самого объекта, то при разработке SQL Server этим решили пренебречь.

Да, хотя такая возможность там действительно присутствует, это не удобно и сложно. Для этого используется системная процедура sp_addextendedproperty.

Строго говоря, эта функция предназначена для создания расширенных свойств для объектов. Свойств у каждого объекта бд может быть много, каждый из них может называться как угодно. Четко задокументированого названия свойства-комментария нет, но множество популярных IDE (я проверял в dbForge и SSMS) считают таковым свойство с названием MS_Description.

Что бы прокомментировать, к примеру, конкретный столбец, нужно отдельно указать схему и таблицу. Для большого количества комментариев это сильно усложнит код.

Вот пример добавления комментария и то как он отображается в dbForge.

EXEC sys.sp_addextendedproperty
 @name=N'MS_Description',
 @value='Имена абонентов' ,
 @level0type=N'SCHEMA',
 @level0name='dbo',
 @level1type=N'TABLE',
 @level1name='ABONENT',
 @level2type=N'COLUMN',
 @level2name='Fio'

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

Скриншота для SSMS у меня, к сожалению, не сохранилось, но сделать его не трудно, если это требуется.

Текст комментария изменяется процедурой sp_updateextendedproperty с таким же длинным и не удобным именем и параметрами:

EXEC sys.sp_updateextendedproperty  
 @name=N'MS_Description',
 @value='Фамилия, имя, отчество абонента' ,
 @level0type=N'SCHEMA',
 @level0name=dbo,
 @level1type=N'TABLE',
 @level1name=ABONENT,
 @level2type=N'COLUMN',
 @level2name=Fio

Удаление: sp_dropextendedproperty

EXEC sys.sp_dropextendedproperty   
 @name=N'MS_Description',
 @level0type=N'SCHEMA',
 @level0name=dbo,
 @level1type=N'TABLE',
 @level1name=ABONENT,
 @level2type=N'COLUMN',
 @level2name=Fio

Данный разбор был бы не полным, если бы я не привел примеры получения списка свойств и получения значения конкретного свойства.

Для этого используется процедура fn_listextendedproperty

/* В следующем запросе мы получим значение только этого свойства и только на этом столбце */
SELECT *
  FROM::fn_listextendedproperty('MS_Description', 
  'schema', 'dbo', 
  'table', 'Abonent', 
  'column', 'Fio');


/* А здесь получим все свойства которые висят на таблице Abonent */
SELECT *
  FROM::fn_listextendedproperty(DEFAULT, 
  'schema', 'dbo', 
  'table', 'Abonent', 
  DEFAULT, DEFAULT);