Technical Article

Generate script for extended properties

,

The stored procedure generates insert script for table and column extended properties in the current database. The generated script checks whether a property exists, if it exists, drop it first. The stored procedure assumes table owner is dbo. It can be easily changed to other users.

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[usp_SYS_GenerateExtendedProperties]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[usp_SYS_GenerateExtendedProperties]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO



-- exec dbo.usp_SYS_GenerateExtendedProperties

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

Rate

5 (1)

You rated this post out of 5. Change rating

Share

Share

Rate

5 (1)

You rated this post out of 5. Change rating