SQLserver中如何通过查询系统表拼接出创建表的SQL语句

在工作中,遇到这样的需求,在一个目标库创建源库中的一个表,并且是通过ssis包传过去,不能通过复制源库中创建表的语句。

那么只能将创建表的语句拼接出来,赋值一个变量,然后将这个变量在目标库中执行以下,就可以在目标库中创建出来新表。

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] 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值