一、创建字典表 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'