segunda-feira, 16 de abril de 2012

Gerando scripts para extended properties


Enquanto estava gerando o dicionário de dados para um dos produtos da empresa, me deparei com a seguinte situação: como as bases de dados são praticamente idênticas entre os clientes, as extended properties são iguais para todos os objetos entre os clientes. Portanto para não ter que digitar todos os comentários entre todos os banco de dados de todos os clientes, como gerar os scripts das Extended Properties de maneira prática? Localizei no SQL SERVER CENTRAL a seguinte procedure que gera estes scripts.

CREATE PROCEDURE dbo.Usp_sys_generateextendedproperties 
AS 
  
-- The procedure generates extended proeprty insertion statements for tables and columns in the current database
  -- Created: phe 2005-05-01 
  
SET xact_abort ON 
  
SET ansi_warnings ON 
  
SET nocount ON 

  
DECLARE @Tables TABLE ( 
    
objid   INT NOT NULL, 
    
tblname NVARCHAR(255) NOT NULL 
    
PRIMARY KEY CLUSTERED (objid)) 
  
DECLARE @Columns TABLE ( 
    
colid   INT NOT NULL, 
    
colname NVARCHAR(255) NOT NULL 
    
PRIMARY KEY CLUSTERED (colid)) 
  
DECLARE @Properties TABLE ( 
    
pid   INT IDENTITY, 
    
pname NVARCHAR(255) NOT NULL, 
    
VALUE NVARCHAR(1000) NOT NULL) 

  
INSERT @Tables 
         
(objid, 
          
tblname) 
  
SELECT id, 
         
name 
  
FROM   sysobjects 
  
WHERE  TYPE = 'U' 
  
ORDER  BY id 

  
DECLARE @objid   INT, 
          
@tblName NVARCHAR(255), 
          
@colName NVARCHAR(255), 
          
@value   NVARCHAR(1000), 
          
@colID   INT, 
          
@Pname   NVARCHAR(255), 
          
@PID     INT 

  
PRINT 'PRINT ''Generats script for extended properties''' + NCHAR(13) + 'GO' + 
        
NCHAR( 
        13
) 

  
PRINT 'SET NOCOUNT ON' 

  
PRINT 'SET QUOTED_IDENTIFIER OFF' + NCHAR(13) + 'GO' 

  
SELECT @objid = MIN(objid) 
  
FROM   @Tables 

  
WHILE @objid IS NOT NULL 
    
BEGIN 
        
SELECT @tblName = tblname 
        
FROM   @Tables 
        
WHERE  objid = @objID 

        
DELETE FROM @Columns 

        
INSERT @Columns 
               
(colid, 
                
colname) 
        
SELECT colid, 
               
name 
        
FROM   syscolumns 
        
WHERE  id = @objid 

        
-- Script table properties 
        
DELETE FROM @Properties 

        
INSERT @Properties 
               
(pname, 
                
VALUE) 
        
SELECT name, 
               
CAST(VALUE AS NVARCHAR(1000)) 
        
FROM   ::fn_listextendedproperty (NULL, 'user', 'dbo', 'table', @tblName 
               
, 
               
DEFAULT, 
                      
DEFAULT) 

        
IF EXISTS(SELECT * 
                  
FROM   @Properties) 
          
BEGIN 
              
SELECT @PID = MIN(pid) 
              
FROM   @Properties 

              
WHILE @PID IS NOT NULL 
    
BEGIN 
        
SELECT @Value = VALUE, 
               
@Pname = pname 
        
FROM   @Properties 
        
WHERE  pid = @PID 

        
SELECT @Pname = REPLACE(@Pname, '''', ''''''), 
               
@Value = REPLACE(@Value, '''', '''''') 

        
PRINT ' IF EXISTS(SELECT * FROM  ::fn_listextendedproperty (''' 
              
+ 
              
@Pname 
              
+ 
                    
''', ''user'', ''dbo'', ''table'', ''' + @tblName 
              
+ 
                    
''', default, default)) BEGIN exec sp_dropextendedproperty ''' + @Pname +
                    ''', ''user'', ''dbo'', ''table'', ''' + @tblName 
              
+ 
                    
''', default, default END exec sp_addextendedproperty ''' + @Pname + ''',''' 
              
+ 
              
@Value + 
                    
''',''user'', ''dbo'', ''table'', ''' + @tblName + 
              
''', default, default GO' + 
          
NCHAR 
              
( 
                13
) 

                    
SELECT @PID = MIN(pid) 
                    
FROM   @Properties 
                    
WHERE  pid > @PID 
                
END 
          
END 

        
-- Script column properties 
        
SELECT @colid = MIN(colid) 
        
FROM   @Columns 

        
WHILE @colID IS NOT NULL 
          
BEGIN 
              
SELECT @ColName = colname 
              
FROM   @Columns 
              
WHERE  colid = @colID 

              
DELETE FROM @Properties 

              
INSERT @Properties 
                     
(pname, 
                      
VALUE) 
              
SELECT name, 
                     
CAST(VALUE AS NVARCHAR(1000)) 
              
FROM   ::fn_listextendedproperty (NULL, 'user', 'dbo', 'table', 
                     
@tblName, 
                     
'column', 
                            
@ColName) 

              
IF EXISTS(SELECT * 
                        
FROM   @Properties) 
                
BEGIN 
                    
SELECT @PID = MIN(pid) 
                    
FROM   @Properties 

                    
WHILE @PID IS NOT NULL 
          
BEGIN 
              
SELECT @Value = VALUE, 
                     
@Pname = pname 
              
FROM   @Properties 
              
WHERE  pid = @PID 

              
SELECT @Pname = REPLACE(@Pname, '''', ''''''), 
                     
@Value = REPLACE(@Value, '''', '''''') 

              
PRINT ' IF EXISTS(SELECT * FROM  ::fn_listextendedproperty (''' 
                    
+ 
                    
@Pname 
                    
+ 
                          
''', ''user'', ''dbo'', ''table'', ''' + @tblName 
                    
+ 
                    
''', ''column'', ''' + 
                          
@ColName + ''')) BEGIN exec sp_dropextendedproperty ''' + 
                    
@Pname + 
                          
''', ''user'', ''dbo'', ''table'', ''' + @tblName 
                    
+ 
                    
''', ''column'', ''' + 
                          
@ColName + ''' END exec sp_addextendedproperty ''' + 
                    
@Pname 
                    
+ 
                    
''', ''' 
                    
+ 
                    
@Value + 
                          
''',''user'', ''dbo'', ''table'', ''' + @tblName + 
                    
''', ''column'', ''' + 
                          
@ColName + ''' GO' + NCHAR(13) 

              
SELECT @PID = MIN(pid) 
              
FROM   @Properties 
              
WHERE  pid > @PID 
          
END 
                
END 

              
SELECT @colid = MIN(colid) 
              
FROM   @Columns 
              
WHERE  colid > @colid 
          
END 

        
SELECT @objid = MIN(objid) 
        
FROM   @Tables 
        
WHERE  objid > @objid 
    
END 

GO 

SET quoted_identifier OFF 

GO 

SET ansi_nulls ON 

GO 

Na situação específica deste dicionário, não estou documentando todas as tabelas, apenas as principais de cada sistema. Portanto, você pode determinar apenas o que você está querendo documentar, alterando o início da procedure:

INSERT @Tables (objid,tblName)
SELECT ID,name FROM sysobjects
WHERE type='U'
AND name IN ('Clientes','Produtos')
ORDER BY id


Abs!

Nenhum comentário:

Postar um comentário

Leave your comment here!