首页 > 代码库 > 用表来管理SQLServer中的扩展属性(描述)

用表来管理SQLServer中的扩展属性(描述)

数据字典是个好东东,对于开发、维护非常重要。

但Sql Server中写描述确实不方便,如何化繁为简、批量地增加修改扩展属性呢?

增加2个表和5个存储过程、2个触发器、1个表值函数就好了。

把下面的SQL执行一遍生成相关的对象, 然后执行一下:

1. EXEC Proc_Util_Desc_GetColumnNameToDescTable , 生成表的描述对应记录

2. EXEC Proc_Util_Desc_GetTableNameToDescTable, 生成列的描述对应记录

3. 查看, 修改一下 dc_util_column_desc 中的某个表某个列的描述,

4. 查看: select * from [dbo].[Fun_GetTableStru](‘表名‘)

爽吧?!


--1.1 建表(存放表的描述):dbo.dc_util_table_desc
IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[dc_util_table_desc]') AND type in (N'U'))
	DROP TABLE [dbo].[dc_util_table_desc]
GO
CREATE TABLE [dbo].[dc_util_table_desc](
	[id] [int] IDENTITY(1,1) NOT NULL,
	[tableName] [varchar](100) NULL,
	[tableDesc] [nvarchar](200) NULL,
 CONSTRAINT [PK_dc_util_table_desc] PRIMARY KEY CLUSTERED 
(
	[id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

--1.2 建表(存放列的描述):[dc_util_column_desc]
IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[dc_util_column_desc]') AND type in (N'U'))
	DROP TABLE [dbo].[dc_util_column_desc]
GO
CREATE TABLE [dbo].[dc_util_column_desc](
	[id] [int] IDENTITY(1,1) NOT NULL,
	[tableName] [varchar](100) NULL,
	[columnName] [varchar](100) NULL,
	[columnDesc] [nvarchar](200) NULL,
 CONSTRAINT [PK_dc_util_column_desc] PRIMARY KEY CLUSTERED 
(
	[id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY],
 CONSTRAINT [UQ_dc_util_column_desc_tableName_columnName] UNIQUE NONCLUSTERED 
(
	[tableName] ASC,
	[columnName] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

--2.1 存储过程
IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Proc_Util_Desc_DeleteInvalidData]') AND type in (N'P', N'PC'))
	DROP PROCEDURE [dbo].[Proc_Util_Desc_DeleteInvalidData]
GO
-- =============================================
-- Author:		yenange
-- Create date: 2014-05-29
-- Description:	删除 dc_util_table_desc 表和 
--              dc_util_column_desc 表中不正确的数据
-- =============================================
CREATE PROCEDURE [dbo].[Proc_Util_Desc_DeleteInvalidData] 
AS
BEGIN
	SET NOCOUNT ON;
	--删除 dc_util_table_desc 中的无效数据
	DELETE FROM dbo.dc_util_table_desc WHERE NOT EXISTS (
		SELECT 1 FROM sys.tables T WHERE dbo.dc_util_table_desc.tableName=T.name
    ) 
    --删除 dc_util_column_desc 中的无效数据
    DELETE 
	FROM   dbo.dc_util_column_desc
	WHERE  NOT EXISTS (SELECT 1 FROM sys.tables t INNER JOIN sys.columns c ON  t.object_id = c.object_id
							WHERE  t.SCHEMA_ID IN (SELECT SCHEMA_ID FROM sys.schemas WHERE  NAME = 'dbo')
								AND dbo.dc_util_column_desc.tableName=t.name AND dbo.dc_util_column_desc.columnName=c.name	
						)
END
GO

--2.2 存储过程
IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Proc_Util_Desc_GetTableNameToDescTable]') AND type in (N'P', N'PC'))
	DROP PROCEDURE [dbo].[Proc_Util_Desc_GetTableNameToDescTable]
GO
-- =============================================
-- Author:		
-- Create date: 2014-05-29
-- Description:	将以 @tablePrefix 为前缀的表名和表对应的扩展属性 insert 到 dc_util_table_desc 表中去.
--              @tablePrefix 如果为 '' 或者 null, 则为全部表(默认为null)
--              @overrideDesc : 如果已有记录存在,是否覆盖原记录的扩展属性 (默认为1)
-- =============================================
CREATE procedure [dbo].[Proc_Util_Desc_GetTableNameToDescTable] 
	@tablePrefix VARCHAR(100) =null, 
	@overrideDesc BIT =1
AS 
BEGIN
	SET NOCOUNT ON
	--删除表中无效的数据
	exec Proc_Util_Desc_DeleteInvalidData
	
	DECLARE @t1 TABLE(rn int IDENTITY(1,1),tablename VARCHAR(100),tabledesc NVARCHAR(200))
	--插入以 @tablePrefix 为前缀的表到@t1
	INSERT INTO @t1
	(
		tablename,
		tabledesc
	)
	SELECT convert(VARCHAR(100),t.name),
		   convert (nvarchar(200),p.value)
	FROM   sys.tables                         AS t
		   LEFT JOIN sys.extended_properties  AS p
				ON  p.major_id = t.object_id
				AND p.minor_id = 0
				AND p.class = 1
				AND p.name = 'MS_Description'
	WHERE  t.SCHEMA_ID IN (SELECT SCHEMA_ID
						   FROM   sys.schemas
						   WHERE  NAME = 'dbo')
	 AND (ISNULL(@tablePrefix,'')='' or t.name LIKE +@tablePrefix+'%' )
	
	DECLARE @i INT
	DECLARE @i_max INT
	DECLARE @t_name VARCHAR(100)
	DECLARE @t_desc NVARCHAR(200)
	SET @i=1
	SELECT @i_max=COUNT(1) FROM @t1
	WHILE @i<=@i_max
		BEGIN
			SELECT @t_name=tablename,@t_desc=tabledesc FROM @t1 WHERE rn=@i
			IF @overrideDesc=1
				begin
					IF EXISTS(SELECT 1 FROM dc_util_table_desc WHERE tableName=@t_name)
						UPDATE dc_util_table_desc SET tableDesc = @t_desc WHERE tableName=@t_name
					ELSE 
						INSERT INTO dc_util_table_desc(tablename,tableDesc) VALUES (@t_name,@t_desc)
				END
			ELSE 
				BEGIN
					IF NOT EXISTS(SELECT 1 FROM dc_util_table_desc WHERE tableName=@t_name)
						INSERT INTO dc_util_table_desc(tablename,tableDesc) VALUES (@t_name,@t_desc)
				END
			set @i=@i+1
		END
END
GO
--2.3 存储过程
IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Proc_Util_Desc_GetColumnNameToDescTable]') AND type in (N'P', N'PC'))
	DROP PROCEDURE [dbo].[Proc_Util_Desc_GetColumnNameToDescTable]
GO
-- =============================================
-- Author:		
-- Create date: 2014-05-29
-- Description:	将以 @tablePrefix 为前缀的表名对应的列和列对应的扩展属性 insert 到 dc_util_column_desc 表中去.
--              @tablePrefix 如果为 '' 或者 null, 则为全部表(默认为null)
--              @overrideDesc : 如果已有记录存在,是否覆盖原记录的扩展属性 (默认为1)
-- =============================================
CREATE procedure [dbo].[Proc_Util_Desc_GetColumnNameToDescTable] 
@tablePrefix VARCHAR(100) =null, 
@overrideDesc BIT =1
AS 
BEGIN
	SET NOCOUNT ON
	--删除表中无效的数据
	exec Proc_Util_Desc_DeleteInvalidData
	
	DECLARE @t1 TABLE(rn int IDENTITY(1,1),tablename VARCHAR(100),COLUMNNAME VARCHAR(100),columndesc NVARCHAR(200))
	--插入以 @tablePrefix 为前缀的表到@t1
	INSERT INTO @t1
	(
		tablename,
		COLUMNNAME,
		columndesc
	)
	SELECT convert(varchar(100),t.name)          ,
		   convert(varchar(100),c.name)              ,
		   convert(nvarchar(200),p.value) 
	FROM   sys.tables                         AS t
		   LEFT JOIN sys.columns c
				ON  t.object_id = c.object_id
		   LEFT JOIN sys.extended_properties  AS p
				ON  p.major_id = t.object_id
				AND p.minor_id = c.column_id
				AND p.class = 1
				AND p.name = 'MS_Description'
	WHERE  t.SCHEMA_ID IN (SELECT SCHEMA_ID
						   FROM   sys.schemas
						   WHERE  NAME = 'dbo')
	 AND (ISNULL(@tablePrefix,'')='' or t.name LIKE +@tablePrefix+'%')
	
	
	DECLARE @i INT
	DECLARE @i_max INT
	DECLARE @t_name VARCHAR(100)
	DECLARE @col_name VARCHAR(100)
	DECLARE @col_desc NVARCHAR(200)
	SET @i=1
	SELECT @i_max=COUNT(1) FROM @t1
	WHILE @i<=@i_max
		BEGIN
			SELECT @t_name=tablename,@col_name=COLUMNNAME,@col_desc=columndesc FROM @t1 WHERE rn=@i
			IF @overrideDesc=1
				begin
					IF EXISTS(SELECT 1 FROM dc_util_column_desc WHERE tableName=@t_name AND columnName=@col_name)
						UPDATE dc_util_column_desc SET columnDesc = @col_desc WHERE tableName=@t_name AND columnName=@col_name
					ELSE 
						INSERT INTO dc_util_column_desc(tablename,columnName,columnDesc) VALUES (@t_name,@col_name,@col_desc)
				END
			ELSE 
				BEGIN
					IF NOT EXISTS(SELECT 1 FROM dc_util_column_desc WHERE tableName=@t_name AND columnName=@col_name )
						INSERT INTO dc_util_column_desc(tablename,columnName,columnDesc) VALUES (@t_name,@col_name,@col_desc)
				END
			set @i=@i+1
		END
END
GO
--2.4 存储过程
IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Proc_Util_Desc_SetDescToTable]') AND type in (N'P', N'PC'))
	DROP PROCEDURE [dbo].[Proc_Util_Desc_SetDescToTable]
GO
-- =============================================
-- Author:		
-- Create date: 2014-05-29
-- Description:	将 dc_util_table_desc 表中的 tableDesc 写到对应表的扩展属性
--				@tablePrefix 为表前缀 如果为 '' 或者 null, 则为全部表(默认为null)
-- =============================================
CREATE PROCEDURE [dbo].[Proc_Util_Desc_SetDescToTable] 
	@tablePrefix varchar(100) = null
AS
BEGIN
	SET NOCOUNT ON
	--删除表中无效的数据
	exec Proc_Util_Desc_DeleteInvalidData
	
	--定义表变量
	DECLARE @t1 TABLE(rn int IDENTITY(1,1),tablename VARCHAR(100),tabledesc NVARCHAR(200))
	--插入需要修改扩展属性的数据到表变量@t1
	INSERT INTO @t1
	(
		tablename,
		tabledesc
	)
	SELECT tablename,tabledesc FROM dc_util_table_desc 
	WHERE ISNULL(@tablePrefix,'')='' OR tablename LIKE +@tablePrefix+'%'
	--循环表变量中的数据
	DECLARE @i INT
	DECLARE @i_max INT
	DECLARE @t_name VARCHAR(100)
	DECLARE @t_desc NVARCHAR(200)
	SET @i=1
	SELECT @i_max=COUNT(1) FROM @t1
	WHILE @i<=@i_max
		BEGIN
			SELECT @t_name=tablename,@t_desc=tabledesc FROM @t1 WHERE rn=@i
			IF isnull(@t_desc,'')=''
			BEGIN
				SET @i=@i+1
				CONTINUE
			END
			--如果表上存在MS_Description就update,不存在就insert
			IF EXISTS (SELECT p.value
						FROM   sys.tables                         AS t
							   LEFT JOIN sys.extended_properties  AS p
									ON  p.major_id = t.object_id
						WHERE  t.SCHEMA_ID IN (SELECT SCHEMA_ID
											   FROM   sys.schemas
											   WHERE  NAME = 'dbo')
						AND		p.minor_id = 0
						AND		p.class = 1
						AND		p.name = 'MS_Description'
						AND		t.name =@t_name)
				BEGIN
					EXEC sp_updateextendedproperty 
							@name = N'MS_Description'
							,@value = http://www.mamicode.com/@t_desc>