SQLserver中如何通过分析系统表拼接出生成表的SQL语言
原创在工作中,遇到这样的要求,在源库中创建一个表,在目标库中创建一个表,并通过。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]
版权声明
所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除