IF EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('[dbo].[mps_gen_create_table]') AND type = 'P')
DROP PROCEDURE [dbo].[mps_gen_create_table]
GO
-- =============================================
-- Author:  flobit
-- Create date: Apr 28 2018  3:35PM
-- Description: 根据mps_field_info中的信息,和指定的表名生成建表语句,支持跨数据库创建,但是一定要保证数据库存在
-- =============================================
CREATE PROCEDURE [dbo].[mps_gen_create_table]
@cmpid int,
@tb_name varchar(512),
@sql varchar(max)='' out
AS
BEGIN
SET NOCOUNT ON;
declare @db_name varchar(32)--数据库名称
declare @index_type varchar(32)--索引类型
declare @index_fileds varchar(256)--索引字段
declare @fldi_key varchar(256)          --主键
declare @fldi_index varchar(256)--主键索引
--尝试从所给的表名中获取数据库的名称,如果没有则默认是当前数据库 DB_NAME()
declare @index int = CHARINDEX('.dbo.',@tb_name);
if @index > 1
begin
set @db_name = SUBSTRING(@tb_name,1,@index+4);
set @tb_name = SUBSTRING(@tb_name,@index+5,LEN(@tb_name));
end else begin
set @db_name = DB_NAME()+'.dbo.'
end
set @sql = ''
--申明临时表
CREATE TABLE #target_fieldinfo(fldi_id int)
--往临时表中添加字段
exec mps_add_targetfieldinfo_field
--往临时表中填充数据,规范化的数据
exec mps_normalize_targetfieldinfo @cmpid,@db_name,@tb_name
--拼接基本建表SQL
set @tb_name=@db_name+@tb_name
set @sql+='create table '+@tb_name+'( '
select @sql+=
--字段名
fldi_fieldname+' '
--字段类型
+ fldi_nlzdatatype
--如果要为一个字段添加主键约束,那么这个字段必须有NOT NULL约束.
--这里可以考虑在添加主键约束之前再添加NOT NULL约束以提高效率
+ case when fldi_key is not null and (CHARINDEX(fldi_fieldname+',',fldi_key)>0 or CHARINDEX(fldi_fieldname+'(',fldi_key)>0) or fldi_fieldname=fldi_key
  then ' NOT NULL ' else '' end
--处理IDENTITY和默认值,IDENTITY和默认值不能并存
+ case when fldi_ident=0 then ' IDENTITY(1,1) ' 
  else ' default ('+fldi_default+')' end
+','
from #target_fieldinfo 
--删除字段列表中多余的,
set @sql=SUBSTRING(@sql,1,LEN(@sql)-1)
--结束建表
set @sql+=')'

--开始处理索引和主键

--必须先创建索引再创建主键约束,因为一个表只允许创建一个聚集索引,而创建主键约束的时候会默认创建聚集索引
--所以如果先创建主键约束就无法再创建聚集索引,如果表中已经创建了聚集索引,那么主键就会自动创建为非聚集索引
--创建索引,从临时表中获取需要创建的索引字段和索引的类型
select distinct @fldi_index=fldi_index from #target_fieldinfo where fldi_index IS NOT NULL and fldi_index!=''
if @fldi_index IS NOT NULL
begin
set @index_fileds=LTRIM(RTRIM(SUBSTRING(@fldi_index,1,CHARINDEX('(',@fldi_index)-1)))
--分析索引类型
set @index_type=LTRIM(RTRIM(UPPER(SUBSTRING(@fldi_index,CHARINDEX('(',@fldi_index)+1,LEN(@fldi_index)-LEN(@index_fileds)-2))))+'ED'
set @sql+=char(13)+char(10)+'CREATE '+@index_type+' INDEX INDEX_'+UPPER(REPLACE(@index_fileds,',','_'))+' ON '+@tb_name +'('+@index_fileds+')'
end
--创建主键约束
select distinct @fldi_key= fldi_key from #target_fieldinfo where fldi_key IS NOT NULL and fldi_key!=''
--多个主键并且要创建索引的情况
if @fldi_key IS NOT NULL and CHARINDEX(')',@fldi_key)>0
begin 
set @index_fileds=TRIM(SUBSTRING(@fldi_key,1,CHARINDEX('(',@fldi_key)-1))
set @index_type=TRIM(UPPER(SUBSTRING(@fldi_key,CHARINDEX('(',@fldi_key)+1,LEN(@fldi_key)-LEN(@index_fileds)-2)))+'ED'
set @sql+=char(13)+char(10)+'alter table '+@tb_name+' add constraint constraint_'+REPLACE(@tb_name,'.','_')+'_primary_key_index primary key '+@index_type+'('+@index_fileds+')'
end else --创建纯粹的主键约束
if @fldi_key IS NOT NULL 
begin
set @sql+=char(13)+char(10)+'alter table '+@tb_name+' add primary key ('+@fldi_key+')'
end
--select @sql as Text
END