简单实现通过数据字典创建表

一、创建字典表 Sys_DicTable

字段名 类型 主键 允许为空 默认值 说明
id int(自增)      
TableName varchar(100)     表名称
FieldName varchar(100)     字段名
FieldType varchar(100)     字段类型,含长度信息,如varchar(100)
IsAutoAdd bit   0 是否为自增字段,自增字段必须为数字类型,通常为int
AutoStartValue int     自增字段起始值
AutoAddValue int     自增字段增量值
IsPrimaryKey bit   0 是否为主键,暂不支持多字段联合主键,一个表只能有一个字段设为主键
DefaultValue varchar(500)     默认值,自增字段时忽略此项,如不设默认值字段值应为NULL
AllowNull bit   1 是否允许为空
Description varchar(500)     字段说明
SortIndex int   0 字段顺序
--添加测试数据
INSERT INTO Sys_DicTable VALUES ('testadd','id','int',1,1,1,1,NULL,0,NULL,0)
INSERT INTO Sys_DicTable VALUES ('testadd','f1','varchar(20)',0,1,0,0,'''''',1,'字段1说明',1)
INSERT INTO Sys_DicTable VALUES ('testadd','f1','numeric(18,2)',0,1,0,0,'0.00',0,'字段2说明',2)

 二、创建存储过程

-- =============================================
-- Author:		
-- Create date: 
-- Description:	根据字典表数据生成表结构
-- =============================================
CREATE PROCEDURE [dbo].[CreateTable]
	@GenTableName	  varchar(100)		--表名
AS
BEGIN
	SET NOCOUNT ON;
	/* 
	字典表说明:字典表名称必须为Sys_DicTable
	字典表结构:
	   TableName		varchar(100) --表名称
	   FieldName		varchar(100) --字段名
	   FieldType		varchar(100) --字段类型
	   IsAutoAdd		bit			 --是否为自增字段
	   AutoAddValue		int			 --每次增幅
	   IsPrimaryKey		bit			 --是否为主键,暂不支持多字段联合主键,一个表只能有一个字段设为主键
	   DefaultValue		varchar(500) --默认值
	   AllowNull		bit			 --是否可以为NULL
	   Description		varchar(500) --字段说明
	   SortIndex		int			 --顺序
	*/
    -- Insert statements for procedure here
    
    If Exists(SELECT 1 FROM [sysobjects] WHERE name =@GenTableName)
    Begin
		select '表['+ @GenTableName +']已存在。' As Error
		return
    End
    
    Declare @SqlChar varchar(8000) = '', @ExecSql varchar(8000) = ''
    
    If Exists(Select 1 From Sys_DicTable
				Where TableName=@GenTableName And IsPrimaryKey=1
				Group By IsPrimaryKey
				Having COUNT(1)>1)
	Begin
		select '表['+ @GenTableName +']设置了多个主键。本系统暂不支持多字段联合主键。' As Error
		return
	End
    
    Declare @TableName		varchar(100)
		   ,@FieldName		varchar(100)
		   ,@FieldType		varchar(100)
		   ,@IsAutoAdd		Bit
		   ,@AutoStartValue int
		   ,@AutoAddValue	int
		   ,@IsPrimaryKey	Bit
		   ,@DefaultValue	varchar(500)
		   ,@AllowNull		Bit
		   ,@Description	varchar(500)
    
    Declare myCur Cursor for
    	Select TableName
    		  ,FieldName
    		  ,FieldType
    		  ,IsAutoAdd
    		  ,AutoStartValue
    		  ,AutoAddValue
    		  ,IsPrimaryKey
    		  ,DefaultValue
    		  ,AllowNull
    		  ,[Description]
    		From Sys_DicTable Where TableName=@GenTableName Order By SortIndex;
	
	OPEN myCur;

	FETCH NEXT FROM myCur 
	INTO @TableName
		,@FieldName
		,@FieldType
		,@IsAutoAdd
		,@AutoStartValue
		,@AutoAddValue
		,@IsPrimaryKey
		,@DefaultValue
		,@AllowNull
		,@Description

	WHILE @@FETCH_STATUS = 0
	Begin
		Set @SqlChar = @SqlChar + @FieldName + ' ' + @FieldType + ' '
		If @IsAutoAdd = 1
		Begin
			Set @SqlChar = @SqlChar
						 + 'IDENTITY(' 
						 + Cast(@AutoStartValue As varchar(10)) 
						 + ',' 
						 + CAST(@AutoAddValue As varchar(10)) + ')'
						 + 'NOT NULL '
		End
		Else
		Begin
			If @AllowNull = 0 Or @IsPrimaryKey = 1
				Set @SqlChar = @SqlChar + 'NOT '
			
			Set @SqlChar = @SqlChar + 'NULL '
			
			If @DefaultValue Is Not Null
				Set @SqlChar = @SqlChar + 'DEFAULT(' + @DefaultValue + ') '
		End
		
		If @IsPrimaryKey = 1
			Set @SqlChar = @SqlChar + 'PRIMARY KEY '
		
		Set @SqlChar = @SqlChar + ','
		
		If @Description Is Not Null
		Begin
			Set @ExecSql = @ExecSql
					     + 'exec sp_addextendedproperty '
					     + 'N''MS_Description'', '
					     + 'N'''+ @Description + ''','
					     + 'N''user'','
					     + 'N''dbo'','
					     + 'N''table'', '
					     + 'N'''+ @TableName +''','
					     + 'N''COLUMN'','
					     + 'N'''+ @FieldName +''''
					     + CHAR(13)
					     --+ 'GO'
					     --+ CHAR(13)
		End
		
		FETCH NEXT FROM myCur 
		INTO @TableName
			,@FieldName
			,@FieldType
			,@IsAutoAdd
			,@AutoStartValue
			,@AutoAddValue
			,@IsPrimaryKey
			,@DefaultValue
			,@AllowNull
			,@Description
	End
	
	Close myCur;
	DEALLOCATE myCur;
	

	If LEN(@SqlChar) = 0
	Begin
		Select '没有找到表' + @GenTableName + '的结构数据' As Error
		Return
	End
	
	Set @SqlChar = LEFT(@SqlChar, LEN(@SqlChar)-1)	--去掉结尾逗号
	
	Set @SqlChar = 'CREATE TABLE '
				 + @GenTableName
				 + '('
				 + @SqlChar
				 + ')'
				 + CHAR(13)
				 --+ 'GO'
				 --+ CHAR(13)
	
	Set @SqlChar = @SqlChar + @ExecSql
	
	Declare @errNum int = 0;
	
	
	Begin TRANSACTION myTran
	Begin Try
		Exec(@SqlChar);
	End Try
	Begin Catch
		Set @errNum = @errNum + 1
		Select '出现异常,错误编号:' + convert(varchar,error_number()) + ',错误消息:' + error_message() As Error
			  ,@SqlChar As SqlStr
			  
		ROLLBACK TRANSACTION
	End Catch
	
	If @errNum = 0
	Begin
		Commit TRANSACTION
		Select '数据表[' + @GenTablename + ']创建成功' As Error
	End

	--Print @SqlChar
END

三、测试数据

Exec CreateTable 'testadd'

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章