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

一、创建字典表 Sys_DicTable

字段名类型主键允许为空默认值说明
idint(自增)   
TableNamevarchar(100)  表名称
FieldNamevarchar(100)  字段名
FieldTypevarchar(100)  字段类型,含长度信息,如varchar(100)
IsAutoAddbit 0是否为自增字段,自增字段必须为数字类型,通常为int
AutoStartValueint  自增字段起始值
AutoAddValueint  自增字段增量值
IsPrimaryKeybit 0是否为主键,暂不支持多字段联合主键,一个表只能有一个字段设为主键
DefaultValuevarchar(500)  默认值,自增字段时忽略此项,如不设默认值字段值应为NULL
AllowNullbit 1是否允许为空
Descriptionvarchar(500)  字段说明
SortIndexint 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'

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值