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
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
Link para o SQL SERVER CENTRAL http://www.sqlservercentral.com/scripts/T-SQL+Aids/31602/
Abs!
Nenhum comentário:
Postar um comentário
Leave your comment here!