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