SQLserver中如何通过分析系统表拼接出生成表的SQL语言

原创
小哥 3年前 (2022-11-02) 阅读数 40 #大杂烩

在工作中,遇到这样的要求,在源库中创建一个表,在目标库中创建一个表,并通过。ssis包已过去传递,无法在源库中创建TABLE语句。

然后,您只能通过拼接创建表的语句、赋值变量,然后在目标库中执行以下变量来在目标库中创建新表。

SQL如下:

declare @sql varchar(8000),@tablename varchar(100)

set @tablename = test_11     --在此处输入表名

set @sql = create table [+@tablename+] (

select @sql = @sql + b.name +  +    --去掉字段的名称
       c.name+                          --取出字段类型的名称
       case when c.collation_name is not null then (+
         case when b.max_length <>-1 then convert(varchar(100),b.max_length)
           else MAX
         end +) 
        else 
       end +                         --取出字段类型的长度
       case when b.is_identity = 1 then  identity(+convert(varchar(100),IDENT_SEED(@tablename))+,+convert(varchar(100),IDENT_INCR(@tablename))+) else  end +
       case when d.definition is not null then  default(+d.definition +) else  end +
       case when b.is_nullable = 0 then  not null else  null end + ,--如果处理该字段,是否自行添加该字段。
from sys.objects a join sys.columns b
on a.object_id = b.object_id
join sys.types c
on b.system_type_id = c.system_type_id and b.user_type_id = c.user_type_id
left join sys.default_constraints d
on b.default_object_id = d.object_id
where a.name=@tablename
order by b.column_id

if exists(select * from sys.indexes where object_id =object_id(@tablename) and is_primary_key =1 )--确定是否有索引,如果有,则执行上面的拼接语句。在没有索引的情况下执行else的语句

begin

select @sql = @sql + CONSTRAINT [+name+] PRIMARY KEY +type_desc+
( from sys.indexes where object_id =object_id(@tablename) and is_primary_key =1
select @sql = @sql + b.name + case when a.is_descending_key =1 then  DESC  else  ASC  end +,
 from sys.index_columns a join sys.columns b
on a.object_id= b.object_id and a.column_id = b.column_id
where a.object_id =object_id(@tablename)
select @sql = left(@sql,len(@sql)-3)+
)
select @sql = @sql+) ON [PRIMARY] 
end
else
begin
select @sql = left(@sql,len(@sql)-1)+
) ON [PRIMARY] 
end

select  @sql

最终结果是:

create table [test_11] (statdate varchar(8)  null,branch_no varchar(6)  null,target_id varchar(10)  null,target_value decimal null,stamp datetime null  ) ON [PRIMARY]

版权声明

所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除

热门