Если вам это действительно нужно, вы можете сопоставить описания столбцов с таблицей «держателей», в которой будут храниться описания для сохранения / загрузки. Эта таблица держателей будет нуждаться в столбце для SchemaName, TableName, ColumnName и Description. Добавьте TRIGGER для этой таблицы, которая будет выполнять команду sp_addextendedproperty (Transact-SQL) или sp_dropextendedproperty (Transact-SQL) SQL Server, чтобы добавить / удалить описание в / из соответствующей схемы .table.column.
таблица будет выглядеть так:
DescriptionHolder
SchemaName sysname
TableName sysname
ColumnName sysname
Description varchar(7500) --or nvarchar(3750)
триггер будет выглядеть так:
CREATE TRIGGER trigger_DescriptionHolder ON DescriptionHolder
INSTEAD OF INSERT,UPDATE,DELETE
AS
SET NOCOUNT ON
IF EXISTS (SELECT * FROM INSERTED)
BEGIN
--handles INSERTS and UPDATEs
--loop begin here over INSERTED
EXECUTE sp_addextendedproperty N'MS_Description', <INSERTED.Description>
,N'SCHEMA' , <INSERTED.SchemaName>
,N'TABLE' , <INSERTED.TableName>
,N'COLUMN' , <INSERTED.ColumnName>
--loop end here
END
ELSE IF EXISTS(SELECT * FROM DELETED)
BEGIN
--handles DELETEs
--loop begin here over DELETED
EXECUTE sp_dropextendedproperty ...
--loop end here
END
Если вы беспокоитесь о том, чтобы таблица не синхронизировалась с реальными описаниями столбцов, вы можете добавить это в конец триггера:
IF EXISTS (SELECT 1 AS x --h.SchemaName,h.TableName,h.ColumnName
FROM DescriptionHolder h
WHERE NOT EXISTS (SELECT 1
from sys.extended_properties p
inner join sys.objects o ON p.major_id=o.object_id
inner join sys.schemas s ON o.schema_id=s.schema_id
inner join sys.columns c ON o.object_id=c.object_id and p.minor_id=c.column_id
where h.SchemaName=s.name AND h.TableName=o.name AND h.ColumnName=c.name)
UNION ALL
select 2 AS x --s.name AS SchemaName,o.name AS TableName,c.name AS ColumnName
from sys.extended_properties p
inner join sys.objects o ON p.major_id=o.object_id
inner join sys.schemas s ON o.schema_id=s.schema_id
inner join sys.columns c ON o.object_id=c.object_id and p.minor_id=c.column_id
where p.class=1 and p.Name='MS_Description'
AND not exists (SELECT 1 FROM DescriptionHolder h WHERE s.name=h.SchemaName AND o.name=h.TableName AND c.name=h.ColumnName)
)
BEGIN
RAISERROR('sys.extended_properties and DescriptionHolder do not match',16,1)
ROLLBACK
RETURN
END
этот код будет выполнять откат и прерывать триггер, если DescriptionHolder не синхронизирован на 100% с фактическими описаниями столбцов в базе данных.