[DiscontinuedDate] [datetime] NULL, [rowguid] [uniqueidentifier] ROWGUIDCOL NOT NULL, [ModifiedDate] [datetime] NOT NULL, CONSTRAINT [PK_Product_ProductID] PRIMARY KEY CLUSTERED ( [ProductID] ASC)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF , IGNORE_DUP_KEY = OFF , ALLOW_ROW_LOCKS = ON , ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]) ON [PRIMARY]... Omitindo a parte que cria os relacionamentosEXEC sys.sp_addextendedproperty @name=N'MS_Description' , @value=N'Primary key for Product records.' , @level0type=N'SCHEMA' ,@level0name=N'Production' , @level1type=N'TABLE' ,@level1name=N'Product' , @level2type=N'COLUMN' ,@level2name=N'ProductID'GOEXEC sys.sp_addextendedproperty @name=N'MS_Description' , @value=N'Name of the product.' , @level0type=N'SCHEMA' , @level0name=N'Production' , @level1type=N'TABLE' , @level1name=N'Product' , @level2type=N'COLUMN' , @level2name=N'Name'GO...Omiti boa parte do codigo para nao ficar extenso. Neste script, toda linha que inicia com EXEC sys.sp_addextendedproperty corresponde a criacao de propriedades estendidas.O cenarioPara demonstrar a utilizacao deste recurso vamos considerar duas tabelas abaixo: PERSONS: Armazena informacoes sobre os usuarios responsaveis pelos projetos. Estes usuarios podem ter varios papeis no sistema. PROJECTS: armazena informacoes sobre os projetos que sao controlados pelo banco de dados.As colunas destas estao demonstradas tambem abaixo:O objetivo da tabela PERSONS e armazenar pessoas que sao responsaveis por registros de projetos mantidos na tabela PROJECTS. Para documentar o objetivo destas tabelas irei usar a stored procedure do sistema SYS.SP_ADDEXTENDEDPROPERTY.Esta precisa receber os seguintes parametros, por ordem:Nome para a propriedade estendida. Deve ser unico.Valor a ser armazenado.Nome nivel do objeto do banco do nivel zero que sera identificado, no caso do exemplo, schemaNome do objeto no caso do exemplo dbo pois e a esse schema que a minha tabela e vinculadaNome do objeto no banco de dados no nivel 1, no caso, uma tabela ou tableIdentificador ou o nome do objeto no bancoDesenvolvimentoPara fazer a inclusao dos objetos o script ficou da seguinte forma para a tabela PERSONS:EXEC sys.sp_addextendedproperty @name=N'Description' ,@value=N'Armazena informacoes sobre os usuarios responsaveis pelos projetos' ,@level0type=N'SCHEMA' ,@level0name=N'dbo' ,@level1type=N'TABLE' ,@level1name=N'persons'GOPara a tabela PROJECTS o script segue abaixo.EXEC sys.sp_addextendedproperty @name=N'Description' ,@value=N'Armazena informacoes sobre os projetos que sao controlados pelo banco de dados' ,@level0type=N'SCHEMA' ,@level0name=N'dbo' ,@level1type=N'TABLE' ,@level1name=N'projects'GOCom isto as propriedades estao incluidas e a partir deste ponto, sempre que forem gerados scripts para estes objetosestes dados serao incluidos.Supondo entao que o objetivo agora seja listar as propriedades estendidas das tabelas deve ser executada a FUNCTION FN_LISTEXTENDEDPROPERTY em conjunto com a instrucao SELECT para poder determinar as colunas a serem recuperadas. O script pronto abaixo vai listar o tipo do objeto e o seu nome (no caso do exemplo, tabelas apenas), o nome da propriedade e o seu valor. select objtype, objname, name, valuefrom fn_listextendedproperty(NULL, 'schema', 'dbo', 'table', null, null, null);Como foi mencionado anteriormente, nao e possivel ter duas propriedades com o mesmo nome mas, e possivel alterar o seu valor com a SP SYS.SP_UPDATEEXTENDEDPROPERTY que deve ser usada como no script abaixo e e muito parecida com a forma com que e usada a SYS.SP_ADDEXTENDEDPROPERTY que faz a criacao da property.ConclusaoManter a documentacao para um banco de dados e uma tarefa dificil e cansativa. Com as propriedades estendidas e possivel facilitar o acesso a alguns dados e simplificar o gerenciamento uma vez que possibilita atualizar a documentacao do banco sempre que houver alteracoes na sua estrutura.Neste post apenas demonstrei como fazer a documentacao para as