数据库骚操作2——列名获取

栏目:云星空知识作者:金蝶来源:金蝶云社区发布:2024-09-16浏览:1

数据库骚操作2——列名获取

后台数据库操作的时候,有时候需要将数据从备份表中插回到系统表里。虽然可以简单的用insert into t_gl_balance select * from t_gl_balancebak,但是在以下场景不能直接使用:

1、包含种子列

2、包含计算列

3、包含时间戳

4、源表中列的排序与目标表中列的排序不相同,因为上面语句并没有显式列出列名

这种情况,就需要显式列出所有的列名了。显式列出所有的列名,一两个表还算可以,多个表就让人头痛了,那么,有什么简单快捷的方法可以获取所有普通列的列名呢?

当。。。当。。。当。。。当。。。

【存储过程】

可以直接使用以下存储过程:

注意:下面方案没有排除种子列,因为种子列是可以通过修改表的参数为允许插入种子列来规避直接插入报错问题。

--存储过程

if exists (select 1 from sys.objects where name='sp_columncollect' and type='P')

drop  procedure sp_columncollect

go

create  procedure sp_columncollect

@ftablename nvarchar(100),

@string nvarchar(2000) out

as 

if  not exists (select 1 from sys.tables where name like 'hb_columncollect')

create table hb_columncollect(ffieldname nvarchar(100) ,fid int )

delete from hb_columncollect

exec('insert into hb_columncollect(ffieldname,fid)

     select name,column_id from sys.columns t where object_id=OBJECT_ID('''+@ftablename+''') and is_computed<>1 and system_type_id<>189    order by column_id ')

set @string=''

select @string=@string+ffieldname+',' from hb_columncollect order by fid

set  @string=substring(@string,1,len(@string)-1)

delete from hb_columncollect

go

【存储过程调用】

--执行测试

declare @string nvarchar(2000)

exec sp_columncollect 't_gl_balance',@string out

--结果显示

select @string FACCOUNTBOOKID,FYEAR,FPERIOD,FACCOUNTID,FDETAILID,FCURRENCYID,FBEGINBALANCEFOR,FBEGINBALANCE,FDEBITFOR,FDEBIT,FCREDITFOR,FCREDIT,FYTDDEBITFOR,FYTDDEBIT,FYTDCREDITFOR,FYTDCREDIT,FENDBALANCEFOR,FENDBALANCE,FADJUSTPERIOD


学习


好骚啊,我喜欢

数据库骚操作2——列名获取

后台数据库操作的时候,有时候需要将数据从备份表中插回到系统表里。虽然可以简单的用insert into t_gl_balance select * from t_gl_b...
点击下载文档
确认删除?
回到顶部
客服QQ
  • 客服QQ点击这里给我发消息