簡單實現通過數據字典創建表

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

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