Комментарии в 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);